目录
一、XPath解析数据
1、XPath解析数据
2、XML的树形结构
3、使用XPath选取节点
4、XPath案例
二、BeautifulSoup解析数据
1、BeautifulSoup
2、BeautifulSoup的使用
3、BeautifulSoup案例
三、正则表达式
1、正则表达式
2、正则语法
3、特殊序列
4、正则处理函数
5、正则案例1
6、正则案例2
四、pyquery解析数据
1、pyquery
2、pyquery的初始化方式
3、pyquery的使用
4、pyquery案例
- XPath
- 全称:XML Path Language是一种小型的查询语言
- 是一门在XML文档中查找信息的语言
- XPath的优点
- 可在XML中查找信息
- 支持HTML的查找
- 可通过元素和属性进行导航
- XPath需要依赖lxml库
- 安装方式: pip install lxml
序号
表达式
描述
1
nodename
选取此节点的所有子节点
2
/
从根节点选择
3
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
4
.
选取当前节点
5
..
选取当前节点的父节点
6
/text()
选取当前路径下的文本内容
7
/@xxx
提取当前路径下标签的属性值
8
|可选符
可选择若干个路径//p|//div,在当前路径下选取所有符合条件的p标签和div标签
序号
表达式
描述
1
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[1]')
选取body下的第一个div节点
2
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ last() ]')
选取body下最后一个div节点
3
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ last()-1 ]')
选取body下倒数第二个div节点
4
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ position()<3 ]')
选取body下前两个div节点
5
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ @class ]')
选取body下带有class属性的div节点
6
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ @class="main" ]')
选取body下class属性为main的div节点
7
xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ price>35.00 ]')
选取body下price元素大于35的div节点
- 下载谷歌浏览器XPath插件
- 安装XPath插件
- 使用XPath
- BeautifulSoup
- 是一个可以从HTML或XML文件中提取数据的Python库。其功能简单而强大、容错能力强、文档相对完善,清晰易懂
- 非Python标准模块,需要安装才能使用
- 安装方式
- pip install bs4
- 测试方式
- import bs4
- 解析器
- BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果不安装第三方解析器,则Python会使用默认浏览器
序号
解析器
使用方法
优点
缺点
1
标准库
BeautifulSoup(html,'html.parser')
内置标准库,速度适中,文档容错能力强
Python3.2版本前的文档容错能力差
2
lxml HTML
BeautifulSoup(html, 'lxml')
速度快,文档容错能力强
安装C语言库
3
lxml XML
BeautifulSoup(html, 'xml')
速度快,唯一支持XML
安装C语言库
4
html5lib
BeautifulSoup(html, 'html5lib')
容错能力最强,可生成HTML5
运行慢,扩展差
- BeautifulSoup提取数据的常用方法
返回值类型
方法
功能
语法
举例
Tag
find()
提取满足要求的首个数据
bs.find(标签,属性)
bs.find('div', class_='books')
Tag
find_all()
提取满足要求的所有数据
bs.find_all(标签,属性)
bs.find_all('div', class_='books')
- CSS选择题
功能
举例
通过ID查找
bs.select('#abc')
通过classa查找
bs.select('.abc')
通过属性查找
bs.select(a[' class="abc" '])
- Tag对象
功能
举例
获取标签
bs.title
获取所有属性
bs.title.attrs
获取单个属性的值
bs.div.get('class')
bs.div['class']
bs.a['href']
- 是一个特殊的字符序列,它能帮助用户便捷地检查一个字符串是否与某种模式匹配
- Python的正则模块是re,是Python的内置模块,不需要安装,导入即可
序号
元字符
说明
1
.
匹配任意字符(不包括 )
2
^
匹配字符串的开头
3
$
匹配字符的末尾
4
*
匹配前一个元字符0到多次
5
+
匹配前一个元字符1到多次
6
?
匹配前一个元字符0到1次
7
{m}
匹配前一个字符m次
8
{m,n}
匹配前一个字符m到n次
9
{m,n}?
匹配前一个字符m到n次,并且取尽可能少的情况
10
\
对特殊字符进行转义
11
[]
一个字符的集合,可匹配其中任意一个字符
12
|
逻辑表达式“或”,比如 a|b 代表可匹配a或者b
13
(...)
被括起来的表达式作为一个元组。findall()在有组的情况下只显示组的内容
序号
元字符
说明
1
A
只在字符串开头进行匹配
2
b
匹配位于开头或者结尾的空字符串
3
B
匹配不位于开头或者结尾的空字符串
4
d
匹配任意十进制数,相当于[0-9]
5
D
匹配任意非数字字符,相当于[^0-9]
6
s
匹配任意空白字符,相当于[ fv]
7
S
匹配任意非空白字符,相当于[^ fv]
8
w
匹配任意数字、字母、下划线,相当于[a-zA-Z0-9_]
9
W
匹配任意非数字、字母、下划线,相当于[^a-zA-Z0-9_]
10
Z
只在字符串结尾进行匹配
11
[一-龥]
中文
序号
正则处理函数
说明
1
re.match(pattern, string, flags=0)
尝试从字符串的开始位置匹配一个模式,如果匹配成功,就返回一个匹配成功的对象,否则返回None
2
re.search(pattern, string, flags=0)
扫描整个字符串并返回第一次成功匹配的对象,如果匹配失败,就返回None
3
re.findall(pattern, string, flags=0)
获取字符串中所有匹配的字符串,并以列表的形式返回
4
re.sub(pattern, repl, string, count=0,flags=0)
用于替换字符串中的匹配项,如果没有匹配的项则返回没有匹配的字符串
5
re.compile(pattern[ ,flags ])
用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()函数使用
爬取数据时,一定要记得先找F12代码,看看和爬取的数据是否一致,若一致,则可直接提取。
- pyquery库是jQuery的Python实现,就能以jQuery的语法来操作解析HTML文档,易用性和解析速度都很好
- 前提条件:
- 你对CSS选择器与jQuery有所了解
- 非Python标准模块,需要安装
- 安装方式
- pip install pyquery
- 测试方式
- import pyquery
- 安装方式
- 字符串方式
- url方式
- 文件
序号
提取数据
举例
1
获取当前节点
doc('#main')
2
获取子节点
doc('#main').children()
3
获取父节点
doc('#main').parent()
4
获取兄弟节点
doc('#main').siblings()
5
获取属性
doc('#main').attr('href')
6
获取内容
doc('#main').html() doc('#main').text()