Beautiful Soup
- BS是python的一个XML或HTML的解析库
- Beautiful Soup支持的解析器
Python标准库
BeautifulSoup(markup, 'html.parser')
Python的内置标准库,执行速度适中,文档容错能力强
BeautifulSoup(markup, 'lxml')
速度快、文档容错能力强,需要安装C语言库
BeautifulSoup(markup, 'xml')
速度快、唯一支持XML的解析器,需要安装C语言库
BeautifulSoup(markup, 'html5lib')
提供最好的容错性、以浏览器的方式解析文档,生成HTML5格式的文档、速度慢,不依赖外部扩展
- BS4的基本使用
# 使用lxml库解析,完成BS对象初始化(可以自动更新HTML格式)
soup = BeautifulSoup(html, 'lxml')
# 把要解析的字符串以标准的缩进格式输出
print(soup.prettify())
# 输出soup内容中title节点的文本内容
print(soup.title.string)
- 节点选择器
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)
- 提取信息
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 获取节点名称
print(soup.title.name)
# 获取一个节点的所有属性(以字典的形式返回)
print(soup.p.attrs)
# 获取p节点属性名为name的值
print(soup.p.attrs['name'])
print(soup.p['name'])
print(soup.p['class'])
# 获取p节点的直接子节点(contents返回的是直接子节点组成的列表)
print(soup.p.contents)
# 获取p节点下的所有孩子节点(children返回的是一个生成器类型)
print(soup.p.children)
for i, child in enumerate(soup.p.children):
print(i, child)
# 获取所有子孙节点
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
print(i, child)
# 获取p节点的父亲
print(soup.p.parent)
# 获取p节点的所有祖先
print(type(soup.p.parents))
print(list(enumerate(soup.p.parents)))
# 获取下一个兄弟
print(soup.a.next_sibling)
# 获取上一个兄弟
print(soup.a.previous_sibling)
# 获取下面的兄弟
print(list(enumerate(soup.a.next_siblings)))
# 获取上面的兄弟
print(list(enumerate(soup.a.previous_siblings)))
# 获取a节点的祖先节点类型
print(type(soup.a.parents))
# 获取a节点的第一个祖先
print(list(soup.a.parents)[0])
# 获取a节点的第一个祖先的class属性
print(list(soup.a.parents)[0].attrs['class'])
- 方法选择器
find_all:查询所有符合条件的元素
# find_all()参数说明:
"""
find_all(name, attrs, recursive, text, **kwargs)
"""
from bs4 import BeautifulSoup
- 使用name查找
html = """
"""
soup = BeautifulSoup(html, 'lxml')
# 调用find_all()方法查询所有ul节点,返回结果是列表类型,每个元素时bs4.element.Tag类型
print(soup.find_all(name='ul'))
# 再查出ul里面的li
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
# 遍历每一个li节点拿文本内容
for ul in soup.find_all(name='ul'):
for li in ul.find_all(name='li'):
print(li.string)
- 使用attrs查找
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))
# 常用的也可以用下面这种方式
print(soup.find_all(id='list-1'))
print(soup.find_all(class_='elements'))
- 使用text查找
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text=re.compile('link')))
- 使用find查找
find():返回查找到的第一个结果
find_parents():返回所有祖先节点
find_parent():返回直接父节点
find_next_siblings():返回后面所有的兄弟节点
find_next_siblings():返回后面第一个兄弟节点
find_previous_siblings():返回前面的所有兄弟节点
find_previous_siblings():返回前面第一个兄弟节点
find_all_next():返回节点后面符合条件的所有节点
find_next():返回后面第一个符合条件的第一个节点
find_all_previous:返回节点前面所有符合条件的节点
find_previous:返回节点前面符合条件的第一个节点