1. 解析器
推荐使用lxml解析器,它有解析XML和LXML的功能,速度快、容错能力强。
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>','lxml')
print(soup.p.string)
2. 节点选择器
- 选择元素
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.title) #打印出title节点以及里面的内容
print(soup.tilte.string) #打印title节点里的文本内容
print(soup.p) #打印出第一个p节点
- 提取信息
- 获取属性
print(soup.p.attrs) #打印出p节点里的所有属性和属性值组合成一个字典 print(soup.p.attrs['name') #打印出p节点里的name属性的值,等同于print(soup.p['name']
- 获取内容
print(soup.p.string)
- 嵌套选择
print(soup.head.title) #打印head节点里的title节点 print(soup.head.title.string) #打印head节点里title节点的文本内容
- 关联选择
- 子节点和子孙节点
print(soup.p.contents) #打印出p节点下的子节点 print(soup.p.children) #同上 print(soup.p.descendants) #打印出p节点下的子孙节点
- 父节点和祖先节点
print(soup.a.parent) #打印出a节点的父节点 print(soup.a.parents) #打印出a节点的祖先节点
- 兄弟节点
print(soup.p.next_sibling) #打印出下一个兄弟元素 print(soup.p.previous_sibling) #打印出前一个兄弟元素 print(soup.p.next_siblings) #打印出后面的兄弟节点 print(soup.p.previous_siblings) #打印出前面的兄弟节点
3. 方法选择器
- find_all()
API:find_all(name,attr,recursive,text,**kwargs)
(1)name:节点名
print(soup.find_all(name='ul') ) #查找所有节点名为ul的节点
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li')) #打印出所有ul节点下的li节点
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print(li.string) # 打印出所有ul节点下li节点的文本信息
(2)attr:属性
print(soup.find_all(attrs={'id':'list-1'})) #打印出id为list-1的节点
print(soup.find_all(id='list-1')) #同上
- 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():前者返回节点前所有符合条件的节点,后者返回节点前符合条件的第一个节点
4. CSS选择器
- 嵌套选择
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('ul'):
print(ul.select('li')) #返回所有ul节点下所有li节点组成的列表
- 获取属性
for ul in soup.select('ul'):
print(ul['id']) #等同于print(ul.attrs['id'])
- 获取文本
for li in soup.select('li'):
print(li.get_text()) #等同于print(li.string)
5. 总结
- 推荐使用lxml解析库,必要时使用html.parser
- 节点选择筛选功能弱但是速度快
- 建议使用find()或者find_all()查询匹配单个或者多个结果
- 如果对CSS选择器熟悉的话,可以使用select()方法选择
以上总结源于崔庆才的《python3网络爬虫开发实战》
网友评论