前言
Python3通过BeautifulSoup实现HTML和XML数据解析
下载依赖
1 2 3
| pip3 install beautifulsoup4 pip3 install lxml pip3 install html5lib
|
引入依赖
1
| from bs4 import BeautifulSoup
|
创建soup对象
传递HTML文件进行解析
'lxml':定义解析器
1
| soup = BeautifulSoup(open("index.html"), 'lxml')
|
传递HTML字符串进行解析
1
| soup = BeautifulSoup("<html></html>", 'lxml')
|
选择器
节点选择器
- 根据HTML标签名获取节点对象
- 多个同名节点只得到第一个节点
- 返回
bs4.element.Tag对象
html:节点名
多级节点
关联选择
子节点
返回列表
返回生成器
子孙节点
父节点
祖先节点
兄弟节点
后面的一个节点
后面的所有节点
前面的一个节点
1
| soup.html.previous_sibling
|
前面的所有节点
1
| soup.html.previous_siblings
|
CSS选择器
1
| soup.select("html #id .class")
|
嵌套选择
1
| soup.select("#id > #id")
|
1
| soup.select("#id").select("#id")
|
方法选择器
find():返回第一个符合条件的节点对象
find_all():返回所有符合条件的节点对象列表
find_parent():返回第一个符合条件的父节点对象
find_parents():返回所有符合条件的父节点对象
find_next_sibling():返回第一个符合条件的兄弟节点对象
find_next_siblings():返回所有符合条件的兄弟节点对象
find_previous_sibling():返回第一个符合条件的兄弟节点对象
find_previous_siblings():返回所有符合条件的兄弟节点对象
find_next():返回第一个符合条件的后续节点对象
find_all_next():返回所有符合条件的后续节点对象
find_previous():返回第一个符合条件的前置节点对象
find_all_previous():返回所有符合条件的前置节点对象
传递name参数
- 如果传递的是字符串列表,则表示与列表的任意一个元素作为标签名匹配
- 如果传递的是正则表达式,则会以
match()函数来匹配结果
1
| soup.find(re.compile(""))
|
传递attrs参数
1
| soup.find(attrs={"class": ""})
|
传递kwargs参数
class是Python中的关键字,所以需要改用class_
传递text参数
1
| soup.find(name="", text="")
|
limit参数
1
| soup.find_all(name="", limit=1)
|
recursive参数
- 限制是否递归,默认为True,表示递归操作,False表示不递归操作
1
| soup.find(name="", recursive=True)
|
- 如果返回列表的方法,使用
recursive=False后可能会返回[]
- 如果返回对象的方法,使用
recursive=False后可能会返回None
获取节点名
获取节点属性
1
| soup.html.attrs["class"]
|
获取节点内容
完成
参考文献
哔哩哔哩——博学谷