爬虫采集:数据提取

目录

1. 数据分类

2. JSON 

 2.1 json数据转换​编辑

3. 正则表达式

3.1 re模块

3.1.1 常见方法

 3.1.2 单字符匹配

3.1.4 匹配开头和结尾

3.1.5 分组匹配

3.1.6 贪婪非贪婪匹配

4. Xpath 

 4.1 语法

4.2 查找特定节点

4.3 lxml 模块

4.3.1 安装

4.3.2 导入

 4.3.3 使用

5. BeautifulSoup

5.1 Bs4 使用

5.1.1 下载导入

 5.1.2 lxml解析器

5.2 CSS 选择器

5.2.1 通过标签选择器查找

5.2.2 通过类选择器查找

5.2.3 通过 id 选择器查找

5.2.4 层级选择器 查找

5.2.5 通过属性选择器查找

5.2.6 获取文本内容 

5.2.7 获取属性 

5.2.8 伪类选择器

5.3 find_all

1) name 参数

2) attrs参数

5.4 find

5.4.1 区别


1. 数据分类

  • 结构化数据:json,xml等

    • 处理方式:转化为python类型

  • 非结构化数据:HTML

    • 处理方式:正则表达式、xpath、bs4

2. JSON 

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

 2.1 json数据转换

  json.dumps:python类型转化为json字符串

json_str = json.dumps(mydict,indent=2,ensure_ascii=False)
indent实现换行和空格
ensure_ascii=False实现让中文写入的时候保持为中文

  json.loads:json字符串转化为python的数据类型

my_dict = json.loads(json_str)

  json.dump:把python类型写入类文件对象

with open("temp.txt","w") as f:
    json.dump(mydict,f,ensure_ascii=False,indent=2)

  json.load:类文件对象中的json字符串转化为python类型

with open("temp.txt","r") as f:
    my_dict = json.load(f)

3. 正则表达式 

用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑

3.1 re模块

 1.使用 pip install re 下载模块

 2.使用 import re 导入模块 

3.1.1 常见方法

  • pattern.match(从头查找匹配一个)返回一个match对象,找不到返回None

  • pattern.search(任意位置匹配一个)返回一个search对象,找不到返回None

  • pattern.findall(全部匹配)返回一个列表,没有就是空列表

  • pattern.sub(替换)

  • re.compile(编译)

    • 返回一个模型P,具有和re一样的方法,但是传递的参数不同

    • 匹配模式需要传到compile中

  • re的修饰符

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

 3.1.2 单字符匹配

代码功能
.匹配任意1个字符(除了\n)
[ ]匹配[ ]中列举的字符
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W匹配特殊字符,即非字母、非数字、非汉字

 3.1.3 多字符匹配

代码功能
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现1次或者无限次,即至少有1次
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}匹配前一个字符出现m次
{m,n}匹配前一个字符出现从m到n次

3.1.4 匹配开头和结尾

代码功能
^匹配字符串开头
$匹配字符串结尾

3.1.5 分组匹配

代码功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串
(?P)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

3.1.6 贪婪非贪婪匹配

功能描述
贪婪匹配正则表达式一般趋向于最大长度匹配,默认贪婪匹配。                      
非贪婪匹配尽量少的匹配字符 在量词后面直接加上一个 

4. Xpath 

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历

 4.1 语法

表达式描述
nodename选中该元素。
/从根节点选取、或者是元素和元素间的过渡。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。
text()选取文本。

4.2 查找特定节点

路径表达式结果
//span[@class="first"]选择class属性值为first的所有span标签
//ul/span[1]选取属于 ul子标签的第一个 span标签。
//ul/span[last()]选取属于 ul子标签的最后一个 span标签。
//ul/spanlast()-1]选取属于 ul子标签的倒数第二个span标签。
//ul/span[position()>1]选择ul下面的span标签,从第二个开始选择
//li/span/a[text()='目录 ']选择所有li下的span标签,仅仅选择文本为 目录 的a标签
//ul/li[position()>5 and position()<13]选择ul下面的li标签,从第5个开始选择,第3个结束

4.3 lxml 模块

4.3.1 安装

pip install lxml

4.3.2 导入

导入lxml 的 etree 库

 from lxml import etree

 4.3.3 使用

1. 利用etree.HTML,将字符串转化为Element对象,Element对象具有xpath的方法,返回结果的列表,能够接受bytes类型的数据和str类型的数据

2. 把转化后的element对象转化为字符串,返回bytes类型结果 etree.tostring(element)

3.使用xpath 进行提取

html = etree.HTML(text) 
ret_list = html.xpath("xpath字符串")

5. BeautifulSoup

Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

5.1 Bs4 使用

5.1.1 下载导入

1. 下载

pip install bs4

2.导入

from bs4 import BeautifulSoup

 5.1.2 lxml解析器

 使用以下方式指定lxml解析器

soup = BeautifulSoup(html,“lxml”)
解析器使用方法优势劣势
Python标准库BeautifulSoup(markup,"html.parser")Python 的内置标准库、执行速度适中 、文档容错能力强Python 2.7.3 or3.2.2) 前的版本中文容错能力差
LXML HTML 解析器BeautifulSoup(markup,"lxml")速度快、文档容错能力强需要安装 C 语言库
LXML XML解析器BeautifulSoup(markup,"xml")速度快、唯一支持 XML 的解析器需要安装 C 语言库
html5libBeautifulSoup(markup,"html5lib")最好的容错性、以浏览器的方式解析文档、生成 HTML5 格式的文档速度慢、不依赖外部扩展

5.2 CSS 选择器

5.2.1 通过标签选择器查找

title = soup.select('title')

print(soup.select('a'))

print(soup.select('span'))

5.2.2 通过类选择器查找

data = soup.select('.divcenter')
# 类名中间带空格处理方式
class_data = soup.select('.adsbygoogle.allinone_good')

5.2.3 通过 id 选择器查找

idata = soup.select('#first')

5.2.4 层级选择器 查找

div_data = soup.select('div .navigat')

5.2.5 通过属性选择器查找

tr_list = soup.select('tr[align="center"]')

a_list = soup.select('a[class="navigat"]')

5.2.6 获取文本内容 

titles = soup.select('title')
for title in titles:
    print(title.get_text())

5.2.7 获取属性 

a_href = soup.select('li a[class="blue"]')
for a in a_href:
    print(a.get('href'))

5.2.8 伪类选择器

addrs = soup.select('tr td:nth-child(3)')
for addr in addrs:
    print(addr.get_text())

5.3 find_all

find_all(name, attrs, recursive, text, **kwargs)

1) name 参数

  • 传入字符串:搜索方法中传入一个字符串参数,查找与字符串完整匹配的内容。
span = soup.find_all('span')
返回文档中所有的span标签
  • 传入正则表达式:通过正则表达式的 match() 来匹配内容。
import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)
返回b开头的标签
  • 传入列表:与列表中任一元素匹配的内容返回。
data = soup.find_all(['a', 'span'])
返回a和span标签的任意一个标签

2) attrs参数

data = soup.find_all(attrs={'class':"blue"})
返回class类名为blue的标签

5.4 find

find的用法与find_all一样

5.4.1 区别

find: 返回 第一个符合匹配结果

find_all: 返回 所有匹配结果的列表

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【行为型模式】命令模式

一、命令模式概述 命令模式的定义&#xff1a;将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(对象行为型) 命令模式优缺点&#xff1a; 优点&#xff1a; 1.类间解耦&#xff1a;调用者角色与接收者角色之间没有任何依…

TPG原理以及verilog实现

文章目录 一、前言二、verilog代码实现三、仿真以及结果分析 一、前言 TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据&#xff0c;对视频数据通路测试。根据视频输出时序产生相应的图像数据 二、verilog代码实现 timescale 1ns / 1nsmodule tpg ( i…

鸿蒙入门10-CheckBoxGroup组件

复选框群组 用于控制多个复选框全选或者不全选状态 参数 参数形式 &#xff1a; CheckboxGroup( options?: { group?: string } ) 创建复选框群组&#xff0c;可以用于控制群组内的 CheckBox 成员 全选 或者 不全选 相同 group 的 CheckBox 和 CheckBoxGroup 为同一群组 参…

Python turtle海龟绘制美国队长盾牌

使用Python中的turtle模块绘制美队盾牌 具体思路如下&#xff1a; 导入海龟库第1个圆&#xff1a;半径 200&#xff0c;红色填充第2个圆&#xff1a;半径 150&#xff0c;白色填充第3个圆&#xff1a;半径 100&#xff0c;红色填充第4个圆&#xff1a;半径 50&#xff0c;蓝色…

摩科智能协办“提高不动产登记质量,促进优化营商环境培训会”

为深入落实国家和自治区自然资源工作会议精神&#xff0c;加强不动产登记队伍作风常态化建设&#xff0c;提高不动产登记质量&#xff0c;促进优化营商环境&#xff0c;学习先进地区工作经验。2024年4月19日&#xff0c;“提高不动产登记质量 促进优化营商环境培训会”在浙江省…

在PostgreSQL中如何实现分区表以提高查询效率和管理大型表?

文章目录 解决方案1. 确定分区键2. 创建分区表3. 数据插入与查询4. 维护与管理 示例代码1. 创建父表和子表2. 插入数据3. 查询数据 总结 随着数据量的增长&#xff0c;单一的大型表可能会遇到性能瓶颈和管理难题。PostgreSQL的分区表功能允许我们将一个大型表分割成多个较小的、…

windows驱动开发-内存概述

“90%的程序问题都是由内存引起的&#xff0c;剩下的10%是使用内存引起的&#xff01;”这是一句非常经典的论证&#xff0c;实际上&#xff0c;在程序开发中&#xff0c;内存问题就是最大的问题&#xff0c;没有之一。 现代的计算机体系中&#xff0c;内存承载了太多的功能&a…

HttpServlet,ServletContext,Listener它仨的故事

1.HttpServlet。 听起来是不是感觉像是个上古词汇&#xff0c;是不是没有阅读下去的兴趣了&#xff1f;Tomcat知道吧&#xff0c;它就是一个servlet容器&#xff0c;当用户向服务器发送一个HTTP请求时&#xff0c;Servlet容器&#xff08;如Tomcat&#xff09;会根据其配置找到…

Vue项目实现懒加载——自用笔记

熟悉指令语法&#xff1a; <template><HomePanel title"人气推荐" sub-title"人气爆款 不容错过"><ul class"goods-list"><li v-for"item in hotList" :key"item.id"><RouterLink to"/&qu…

嵌入式Linux开发

(17 封私信 / 1 条消息) 嵌入式Linux应用 - 搜索结果 - 知乎 (zhihu.com)

【面试】输出设备-①-Tableau入门

感谢大佬 举个栗子&#xff01;Tableau 技巧&#xff08;266&#xff09;&#xff1a;学做双向圆角条形图-CSDN博客 感谢W3Cschool Tableau 概述_w3cschool 感谢Tableau 官方社区 Discover | Tableau Public 1.目标和计划 近期公司需要进行数据大屏的制作&#xff0c;调研了一下…

【大语言模型LLM】-大语言模型乐园,高效办公不迷路!

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 ❤️感谢大家点赞&#x1f44d; 收藏⭐ 评论⭐ &#x1f3a5;大语言模型LLM基础-系列文章&#xff1a; 【大语言模型LLM】-大语言模型如何编写Prompt? 【大语言模型LLM】-如何…

Pytorch第一部分数据模块

数据划分&#xff1a; 从数据集中将数据划分为训练集&#xff0c;测试集&#xff0c;验证集 # -*- coding: utf-8 -*- """ # file name : 1_split_dataset.py # author : tingsongyu # date : 2019-09-07 10:08:00 # brief : 将数据集划分为训…

Gamba:将高斯溅射与Mamba结合用于单视图3D重建

Gamba: Marry Gaussian Splatting with Mamba for Single-View 3D Reconstruction Gamba&#xff1a;将高斯溅射与Mamba结合用于单视图3D重建 Qiuhong Shen11  Xuanyu Yi31 Zike Wu31  Pan Zhou2,42 Hanwang Zhang3,5 沈秋红 1 易轩宇 3 吴子可 3 潘周 2,4 2 张汉旺 3,5Shu…

验证线缆(汽车线束、网线、多芯线)破损或断开与正常线缆的区别在哪里?依AEM CV-100 k50测试仪

工厂产线生产的线缆&#xff08;汽车线束、网线、多芯线&#xff09;做成成品&#xff0c;即2端都安装好了模块。在这种情况下如何快速的判定此条线缆是合格的呢&#xff0c;此处的合格为物理层面上的合格&#xff08;不会出现开路、短路&#xff09;&#xff0c;也就是最基本保…

【LAMMPS学习】八、基础知识(3.9)输出结构化数据

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

android开发 多进程的基本了解

目录 如何开启多进程?理解多进程模式的运行机制 如何开启多进程? 给四大组件在androidMenifest中指定android:precess <activityandroid:name".ThreeActivity"android:exported"false"android:process"com.my.process.three.remote" />…

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数&#xff0c;然后自动按从大到小的顺序输出。&#xff08;冒泡排序&#xff09; 输入 第一行&#xff0c;数的个数n; 第二行&#xff0c;n个非负整数。 输出 由大到小的n个非负整数&#xff0c;每个数占一行。 样例输入 …

C++异步编程小论

目录 std::async与std::future 其他 std::package_task std::promise Reference 浅论&#xff1a;我看有人写的浅论异步编程的文章实际上在干的是介绍多线程&#xff0c;这里刚好最近对异步编程有所兴趣&#xff1a;我们来看看几个C11新加进来的一些异步编程关键字。 这里…

揭开ChatGPT面纱(3):使用OpenAI进行文本情感分析(embeddings接口)

文章目录 一、embeddings接口解析二、代码实现1.数据集dataset.csv2.代码3.运行结果 openai版本1.6.1 本系列博客源码仓库&#xff1a;gitlab&#xff0c;本博客对应文件夹03 在这一篇博客中我将使用OpenAI的embeddings接口判断21条服装评价是否是好评。 首先来看实现思路&am…