爬虫采集:数据提取

news/2024/9/20 7:27:29/ 标签: 爬虫

目录

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: 返回 所有匹配结果的列表

 


http://www.ppmy.cn/news/1429889.html

相关文章

“华为杯“华南理工大学程序设计竞赛(同步赛)

目录 最长回文子串 又一道好题 信号塔 网格树 异色边2 M 最长回文子串 构造马拉车 #define int long long//__int128 2^127-1(GCC) #define PII pair<int,int> //#define f first //#define s second const int inf 0x3f3f3f3f3f3f3f3f, N 1e5 5, mod 1e9 7;…

移动硬盘中的隐藏文件如何恢复显示?可尝试这些方法

在使用移动硬盘的过程中&#xff0c;有时我们可能会遇到一些文件突然变得不可见或“隐藏”的情况。这种情况可能是由于多种原因造成的&#xff0c;如文件系统错误、病毒感染或误操作等。面对隐藏的文件&#xff0c;许多用户可能会感到困惑和不知所措。本文将向您介绍移动硬盘数…

力扣HOT100 - 19. 删除链表的倒数第N个节点

解题思路&#xff1a; 链表题目&#xff1a;哑节点、栈、快慢指针&#xff08;双指针&#xff09; 方法一&#xff1a;计算链表长度 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dum new ListNode(0, head);int len getLen(head);…

基于51单片机的电子秤LCD1602液晶显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机电子秤LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机电子秤LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.9及以上 程序编译器&#xf…

select实现echo服务器的并发

select实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/select.h> #include <sys/time.h…

c++ 线性搜索与二分搜索

线性搜索 假设该项目以随机顺序存在于数组中&#xff0c;并且我们必须找到一个项目。那么搜索目标项目的唯一方法就是从第一个位置开始&#xff0c;并将其与目标进行比较。如果项目相同&#xff0c;我们将返回当前项目的位置。否则&#xff0c;我们将转移到下一个位置。…

【QT教程】QT6图形渲染与OpenGL编程

QT6图形渲染与OpenGL编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免…

游戏引擎技术——前向渲染与延迟渲染

作者&#xff1a;yangkuKO 一、前言 2015年5月&#xff0c;3A巨作《巫师3&#xff1a;狂猎&#xff08;The Witcher 3&#xff1a;Wild Hunt&#xff09;》横空出世&#xff0c;该游戏作为一款开放世界的角色扮演游戏&#xff0c;其巨大的开放世界、绵长的剧情故事、画面精美…

力扣HOT100 - 24. 两两交换链表中的节点

解题思路&#xff1a; 递归 class Solution {public ListNode swapPairs(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead head.next;head.next swapPairs(newHead.next);newHead.next head;return newHead;} }

贪吃蛇的简单实现(c语言)

前言&#xff1a;学完了C语言的基础语法&#xff0c;和一点数据结构的知识&#xff0c;拿贪吃蛇来练练手&#xff0c;并熟悉以前的知识。写完之后&#xff0c;有一种成就感&#xff0c;为以后的学习饱满激情。 注意这里的讲解是由部分到整体的思路。 目录 控制台不能是终端&am…

【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…

统一SQL-支持Oracle decode函数到TDSQL-MySQL的转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;decode函数语法如下图&#xff1a;该函数功能是将 expr与每个 search 依次做比较&#x…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中&#xff0c;已经对51单片机的串行口结构做过详细介绍&#xff0c;并且通过实例讲解了串行口的4种工作方式中方式1的具体用法&#xff0c;本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式&#xff0c;主要用于扩展并…

SpringBoot---------@Value,@ConfigurationProperyies以及多环境开发配置

application.yml server:port: 8080#logging: # level: # root: info(默认)array:name: zzlage: 18subject:- Java- Vue- SpringBoot Value注解的使用:从yml配置文件中获取数据&#xff0c;即可在类中使用 Value("${server.port}")private String port;Value(&q…

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

文档分享怎么用二维码?扫码获得文档的制作方法

现在日常工作和生活中&#xff0c;经常会看到可以用于展示文件的二维码图片&#xff0c;使用这种方式可以向其他人传递一些资料、通知、数据等情况。比如常见的内容有企业介绍、产品内容、使用说明、活动流程等类型的内容&#xff0c;那么这些不同类型的文件该如何制作二维码呢…

高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xff0c;…

Redis快速入门操作

启动Redis 进入命令行客户端 字符串命令常用操作&#xff08;redis默认使用字符串来存储数据&#xff09; 列表&#xff08;Lists&#xff09;常用操作 集合&#xff08;Sets&#xff09;常用操作 &#xff08;无序集合且元素不可重复&#xff09; 有序集合&#xff08;So…

springboot实现图片防盗链功能

前言&#xff1a; 出于安全考虑&#xff0c;我们需要后端返回的图片只允许在某个网站内展示&#xff0c;不想被爬虫拿到图片地址后被下载。或者&#xff0c;不想浏览器直接访问图片链接。 出于性能考虑&#xff0c;不想要别人的网站&#xff0c;拿着我们的图片链接去展示&…