数据提取之bs4
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, ["lxml-xml"])``BeautifulSoup(markup, "xml") |
速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") |
最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
bs4个常用的对象:
1:tag 对象与XML或HTML原生文档中的tag相同 ---tag的属性操作方法与字典一样
2:NavigatableString
3:BeautifulSoup
4:Comment
基本用法
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml') #首先解析为Unicode文档,然后BS会选择最合适的解析器来解析这段文档,这里是指定lxml解析
print(soup.prettify()) #把要解析的字符串以标准的格式输出
节点选择器:单个节点结构层次非常清晰,推荐使用
1:获取名称--name获取title的节点名称
soup.title.name
2-1:获取属性的值
soup.p.attres #获取p节点的所有属性值
soup.p.attrs['title'] #获取title的属性值
2-2:[]直接获取属性的值
soup.p["name"]
soup.p["title"]
3:获取节点的文本内容 string
soup.p.string
4:嵌套选择---由于html文档的嵌套,bs4.element.Tag可以继续调用节点进行选择
soup.head.title.string #输出title的文本内容
5:关联选择
子节点:
选取节点p之后,获取它的直接子节点---返回一个列表["文本","子节点"]--不会单独列出子孙节点
soup.p.contents
soup.p.children #返回一个生成器,遍历输出结果
子孙节点:
soup.p.descendants #返回一个生成器,遍历输出结果
父节点:parent
祖先节点:parents
find_(name,attes,recursive,text,**kwargs):查询所有符合条件的元素,传入一些属性或文本
1:name根据节点名查找元素--返回一个列表
soup.find_all(name="a")
soup.find_all('a')
2:attrs根据一些属性来查询
soup.find_all('a',id="test",class_="test") #注意class_
href=soup.a.attrs['href']
soup.find_all(attrs={'class':'test'})
3:text参数可用来匹配节点的文本,传入的形式可以使str和正则表达式
soup.find_all(text=re.compile('link-1.html'))
CSS选择器
CSS选择器需要调用select()方法
soup.select('.panel .panel-heading') #class
soup.select('#list-2 .element') # #-id
soup.select('ul li') #普通标签:选择所有ul节点下的所有li节点
获取属性
遍历列表之后,Tag类型
ul['id']
ul.attrs['id']
获取文本:get_text()
for li in soup.select('li'):
print("Get Text:",li.get_text())
print("String:",li.string)
注意点:
## string和strings、stripped_strings属性以及get_text方法:
1. string:获取某个标签下的字符串[1个]。返回来的是个字符串。
2. strings:tag中包含【多个】字符串,子孙字符串。返回来的是个生成器。
2. stripped_strings:输出的字符串中可能包含了很多空格或空行。返回来的是个生成器。
4. get_text():获取某个标签下的所有字符串内容。以普通字符串返回。
原文:https://www.cnblogs.com/zhoujun007/p/12363991.html