解析库
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup,“html.parser”) | python内置,运行速度适中,容错能力强 | python2.7.3 or 3.2版本之前的中文容错能力差 |
lxml HTML解析器 | BeautifulSoup(markup,“lxml”) | 速度快,容错能力强 | 需要安装C语言库 |
lxml XML解析器 | BeautifulSoup(markup,“xml”) | 速度快,唯一支持XML解析 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup,“html5lib”) | 最好的容错性,以浏览器方式解析文档,生成HTML5格式的文档 | 速度慢,不依赖外部扩展 |
基本使用
格式化html
soup.prettify
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"lxml")
print(soup.prettify())#格式化html
获取标签
soup.p
soup.title
…
如果有多个相同名字的标签,只会获得第一个
获取属性
soup.p[“name”]
获取name属性
…
获取内容
soup.p.string
获取p标签中的文字
嵌套选择
soup.head.title.string
标签可以嵌套选择
获取子节点
soup.p.contents
返回一个包含子节点的列表,每一项是一个子节点
soup.p.children
返回的是一个迭代器,需要通过打印才能查看
for i,chlild in enumerate(soup.p.children):
print(i,child)
获取所有的子孙节点
soup.p.descendants
for i,child in enumerate(soup.p.descendants):
print(i,chlid)
获取父节点
soup.p.parent
获取所有的祖先节点
soup.p.parents
print(list(enumerate(soup.p.parents)))
获取兄弟节点
soup.p.next_siblings
soup.p.previous_siblings
print(list(enumerate(soup.p.next_siblings)))
print(list(enumerate(soup.p.previous_siblings))
标准选择器
name
soup.find_all(“ul”)[0]
attrs
soup.find_all(attrs = {‘id’:‘list-1’})
text
soup.find_all(text=“Foo”)
find
返回查找到的第一个元素,find_all是返回所有的
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选择器
soup.select(’.panel .panel_are’)
.panel代表class = panel,父节点与子节点之间用“ ”空格分隔开
soup.select(’#list_2’)
#list_2代表id = list_2
soup.select(‘ul’)[0]
标签直接写
获取属性
for ul in soup.select(“ul”):
print(ul[‘id’])
获取内容
for ul in soup.select(“ul”):
print(ul.get_text())
总结
- 主要使用lxml,必要时使用html.parser
- 标签选择器筛选功能弱但是速度快
- 建议使用find(),find_all()查询单个或者多个结果
- 对CSS熟悉使用select方法
- 记住常用的获取属性和文本的方法