灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页信息的提取。
1 安装:
pip3 install beautifulsoup4
2 使用:
2.1 解析库:
解析器 | 优势 | 劣势 |
---|---|---|
python标准库 (html.parse) | python内置标准库 执行速度适中文档容错能力强 |
与之前版本中文容错能力差 |
lxml html解析器 | 速度快,文档容错能力强 | 需要安装C语言库? |
lxml XML解析器 | 速度快,唯一支持XML的解析器 | 需要安装C语言 |
html5lib | 最好的容错性,以浏览器的放式解析文档生成html5格式的文档 | 速度慢 |
2.2:标签选择器:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html.'xml')
- soup.prettify()
格式化代码,补全,容错处理- soup.title.string()
选中title打印里面的内容
- print(soup.title)
- pirnt(type(soup.title))
- print(soup.head)
- print(soup.p)
连同标签一起打印,只打印第一个结果
获取名称:
- print(soup.title.name)
title
获取属性:
- print(soup.p.attrs['name'])
- print(soup.p['name']
获取内容:
- print(soup.p.string)
嵌套选择:
- print(soup.head.title.string)
子节点和子孙节点:
- print(soup.p.contents)
获取子节点返回类型为列表
获取子节点
for i, child in enumerate(soup.p.children):
print(i, child)
#返回类型为迭代器
获取子孙节点
for i, child enumerate(soup.p.descendants):
print(i,child)
#返回类型为迭代器
父节点和祖先节点:
- print(soup.a.parent)
获取父节点- print(list(enumerate(soup.a.parents)))
枚举,并转化成列表
获取所有祖先节点
获取兄弟节点:
- print(list(enumerate(soup.a.next_siblings)))
获取后面的兄弟节点- print(list(enumerate(soup.a.previous_siblings)))
获取之前的兄弟节点
2.3 标准选择器:
find_all(name,attrs,recursive,text,**kwargs)
- print(soup.find_all('ul'))
- print(soup.find_all(attrs={'name',elements'}))
特殊类型:
- print(soup.find_all(id='list-1'))
- print(soup.find_all(class_='element'))
text:
- print(soup.find_all(text='Foo'))
find(name,attrs,recursive,text,**kwargs)
find返回单个元素,find_all返回所有元素
find_parents()
find_parent()
find_parents()返回所有祖先节点,find_parent()返回直接父节点
find_next_siblings()
find_next_sibling()
find_next_siblings()返回后面所有兄弟节点
find_next_sibling()返回后面第一个兄弟节点
find_previous_sblings()
find_previous_sibling()
find_previous_sblings()返回前面所有兄弟节点
find_previous_sibling()返回前面第一个兄弟节点
find_all_next()
find_next()
find_all_next()返回节点后所有符合条件的节点,
find_next()返回节点后第一个符合条件的节点
find_all_previous()
find_previous()
find_all_previous()返回节点前所有符合条件的节点,
find_previsous(()返回第一个符合条件的节点
2.4 CSS选择器:
通过select()直接传入CSS选择器即可
print(soup.select('.pane .pane-heading')) # .代表class属性
print(soup.select('ul i'))
print(soup.select('#list-2 .element')) # #代表id
#获取属性
for ul in soup.select('ul'):
print(ul['id']) #获取属性
print(ul.attrs['id'] #获取属性
#获取内容
for ul in soup.select('li')
print(ul.get_text())