Beautiful Soup库
官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh
PyPI:https://pypi.python.org/pypi/beautifulsoup4
安装:pip3 install beautifulsoup4
导入:包名为bs4: from bs4 import BeautifulSoup
Beautiful Soup的HTML和XML解析器是依赖于lxml库,安装lxml:pip3 install lxml
解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库、执行速度适中、文档容错能力强 | Python |
*lxml HTML解析器 | BeautifulSoup(markup, "lxml") | 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 | BeautifulSoup(markup, "xml") | 速度快、唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
基本用法
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml') # 初始化beautifulsoup对象,会自动更正不标准格式,第一个参数是html字符串,第二个参数是解析器类型
print(soup.prettify()) # prettify()把要解析的字符串以标准的缩进格式输出
print(soup.title.string) # 选择title标签中的文本
节点选择器(速度快)
直接调用节点的名称就可以选择节点元素,只会选择到第一个匹配的节点为Tag类型.
选取功能 | 选取方法 |
---|---|
选择元素 | soup.tag1.tag2 |
得到节点内的文本 | soup.tag.string |
获取节点的名称 | soup.tag.name |
获取所有属性,字典类型,属性和属性值 | soup.tag.attrs |
获取属性值,依据个数返回字符串或列表 | soup.tag.attrs["属性"]或soup.tag["属性"] |
直接子节点,列表 | soup.tag.contents |
直接子节点,生成器类型 | soup.tag.children |
子孙节点,生成器类型 | soup.tag.descendants |
父节点 | soup.tag.parent |
祖先节点,生成器类型 | soup.tag.parents |
获取节点的下一个兄弟元素 | next_sibling |
获取节点的上一个兄弟元素 | previous_sibling |
前面兄弟节点的生成器 | next_siblings |
后面兄弟节点的生成器 | previous_siblings |
方法选择器
find_all()
查询所有符合条件的元素,得到列表
soup.find_all(name , attrs , recursive , text , limit, ketword)
- name:节点名,字符串
- attrs:属性,键和值的字典
- recursive:布尔值,True会递归查找所有子标签(默认),False查找一级标签
- text:节点的文本,传入字符串或正则表达式对象re.compile(),返回文本组成的列表
- limit:获取网页中的前x项
- keyword:关键字参数,选择具有指定属性的标签(冗余功能)
其他方法
方法 | 功能 |
---|---|
find() | 返回第一个符合条件的元素 |
find_parents() | 返回所有祖先节点 |
find_parent() | 返回直接父节点 |
find_next_siblings() | 返回后面所有兄弟节点 |
find_next_sibling() | 返回后面第一个兄弟节点 |
find_previous_siblings() | 返回前面所有兄弟节点 |
find_previous_sibling() | 返回前面第一个兄弟节点 |
find_all_next() | 返回节点后所有符合条件的节点 |
find_next() | 返回第一个符合条件的节点 |
find_all_previous() | 返回节点前所有符合条件的节点 |
find_previous() | 返回节点前第一个符合条件的节点 |
CSS选择器
调用select()方法,传入相应的CSS选择器
例如:soup.select('#list-2 .element')