BeautifulSoup
- 概述: BeautifulSoup是一个灵活方便的解析库,处理高效,支持多种解析器,利用它不用编写正则表达式即可方便实现网页信息的提取
解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) | Python的内置标准库执行速度适中文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档 | 容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 速度快文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, “xml” | 速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
BeautifulSoup方法
- soup.prettify() 格式化输出
- soup.title.sting title标签内容字符串输出
- soup.title.text/get_text() title标签内容字符串输出
标签选择器
-
选择元素
html = """ <html><head><title>Demo</title></head><body><div> <p>Hello Python</p> <a href="http://www.baidu.com"></a> </div> </body> </html> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.title) # 如果多个,输出第一个结果 print(type(soup.head)) print(soup.p) 输出: <title>Demo</title> <class 'bs4.element.Tag'> <p>Hello Python</p>
-
获取名称
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.title.name) # 获取标签名 输出: title
-
获取属性
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.p['name']) # 获取属性名
-
获取内容
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.p.string) # 获取标签内容 print(soup.p.text) # 获取标签内容
-
子节点和子孙节点
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.body.contents) # 用类表的形式返回子节点 from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.body.children) for i,child in enumerate(soup.body.children): # 返回索引和子节点 print(i,child)
-
父节点和祖先节点
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.span.parent) # 获取父节点 print(list(enumerate(soup.span.parents))) # 获取祖先节点
-
兄弟节点
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(list(enumerate(soup.p.next_siblings))) # 获取后面的兄弟节点 print(list(enumerate(soup.previous_siblings))) # 获取前面的兄弟节点
标准选择器
find_all(name,attrs,recursive,text,**kwargs) 可根据标签名,属性,内容查找文档(返回所有匹配结果)
-
name
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') # print(soup.find_all('p')) # print(soup.find_all('p')[0]) for p in soup.find_all('p'): print(p.find_all('span')) print(p.find_all('span')[0].text)
-
attrs
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.find_all(attrs={'name':'test'})) print(soup.find_all(class_='test')) # class和id有特殊方法 print(soup.find_all(id='span'))
-
text
from bs4 import BeautifulSoup soup = BeautifulSoup(html,'lxml') print(soup.find_all(text='123')) # 只是返回匹配的内容,不返回标签
find(name,attrs,recursive,text,**kwargs) 可根据标签名,属性,内容查找文档(返回第一个匹配结果)
CSS选择器
select()直接传入css选择器即可
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.select('.test.test2 .test4')) # 类
print(soup.select('a .test3')) # 嵌套
print(soup.select('#span')) #id
print(soup.select('p[name]')) # 属性
print(soup.select('p[name=test]'))
```