bs4
bs4
快速方便简单的提取网页中指定的内容,给定一个网页字符串,然后使用他的接口将网页字符串生成一个对象,然后通过这个对象的方法来提取数据
一.安装bs4
pip install bs4
或pycharm编辑器中的settng设置查找、安装bs4
二.安装解析器parser
Beautiful Soup支持 Python标准库中的 HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
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”)、BeautifulSoup(markup, [“lxml-xml”]) | 速度快、唯一支持xml的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢,不依赖外部扩展 |
注意:如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的
三.bs4对象的转换
将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象
from bs4 import BeautifulSoup
# 获得文档对象 - soup
soup = BeautifulSoup(open(文档路径, encoding=编码格式),features=解析器)
或传入字符串或文件句柄
# 传入字符串
soup = BeautifulSoup('liyuhong', features='lxml')
# 输出<html><body><p>liyuhong</p></body></html>
# 传入文件句柄
soup = BeautifulSoup('<html>liyuhong</html>')
# 输出<html><body><p>liyuhong</p></body></html>
解析过程:
- 文档被转换成Unicode,并且HTML实例都被转换成Unicode编码
- BeautifulSoup选择最合适的解析器来解析这段文档,如果手动指定解析器,那么BeautifulSoup会选择指定解析器来解析指定文档
注意:默认解析器情况下,BeautifulSoup会将当前文档作为HTML格式解析,如果要解析XML文档,需要指定"xml"解析器
四. 对象的种类
BeautifulSoup将复杂的HTML文档解转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag, NavigableString, BeautifulSoup, Comment
1.Tag(标签)
tag对象与XML或HTML原生文档中的tag相同
普通标准操作:
soup = BeautifulSoup('<a>liyuhong</a>', features='lxml')
tag_soup = soup.a
print(type(tag_soup))
<class 'bs4.element.Tag'>
*tag的属性
tag中最重要的属性:name和attributes
(1).每个tag都有自己的名字,通过.name
来获取
普通标准操作:
soup = BeautifulSoup('<a>liyuhong</a>', features='lxml')
print(soup.a)
print(soup.a.name)
<a>liyuhong</a>
a
tag.name值的改变(将改变HTML文档):
soup.a.name = "p"
print(soup.a)
print(soup.p)
None
<p>liyuhong</p>
(2).一个tag可能有多个属性,操作与字典相同,通过.attrs
来获取
普通标准操作:
soup = BeautifulSoup('<a class="celebrity">liyuhong</a>', features='lxml')
# 字典操作
soup.a.attrs['class']
# 或直接取点属性
soup.a.attrs
['celebrity']
{'class': ['celebrity']}
tag.attrs的改变(改、增、删):
soup = BeautifulSoup('<a class="celebrity">li</a>', features='lxml')
# 直接打印源tag
print(soup.a)
<a class="celebrity">li</a>
# 1.改变属性的值
soup.a.attrs['class'] = 'lyh'
print(soup.a)
<a class="lyh">li</a>
# 2.添加属性的值
soup.a.attrs['id'] = 'li'
print(soup.a)
<a class="celebrity" id="li">li</a>
# 3.删除属性的值
del soup.a.attrs['class']
<a>li</a>
多值属性:
soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
print(soup.a)
print(soup.a.attrs['class']
# 两个值的class属性
<a class="celebrity liyuhong">li</a>
['celebrity', 'liyuhong']
2.NavigableString(标签的值)
字符串常包含在tag内。BeautifulSoup常用NavigableString
类来包装tag中的字符串。
普通标准用法:
soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
print(soup.a.string)
print(type(soup.a.string))
li
<class 'bs4.element.NavigableString'>
tag中值的替换:
tag中包含的字符串不能被编辑,但是可以被替换成其他字符串,用replace_with()方法
soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
soup.a.string.replace_with('UFO')
print(soup.a.string)
print(soup.a)
UFO
<a class="celebrity liyuhong">UFO</a>
3.BeautifulSoup(文档)
表示的是一个文档的全部内容。.name属性包含一个为"[document]"的特殊值。
print(soup.name)
print(type(soup))
[document]
<class 'bs4.BeautifulSoup'>
4.Comment(注释及特殊字符串)
特殊类型的NavigableString
普通标准操作:
soup = BeautifulSoup('<a><!--who is your daddy?--></a>', features='lxml')
print(type(soup.a.string))
<class 'bs4.element.Comment'>
五.bs4语法
(1).获取属性
# 获取p标签的属性
# 方法一
soup.p.attrs(返回字典) or soup.p.attrs['class'](class返回列表,其余属性返回字符串)
# 方法二
soup.p['class'](class返回列表,其余属性返回字符串)
# 方法三
soup.p.get('class')(class返回列表,其余属性返回字符串)
(2).获取文本
# 获取标签的值的三种方法
soup.p.string
soup.p.text
soup.p.get.text()
注意:当标签的内容还有标签时,string方法返回为None,而其他两个方法获取纯文本内容
(3).find方法
返回一个对象
soup.find('a')
soup.find('a', class_='xxx') # 注意class后的下划线
soup.find('a', title='xxx')
soup.find('a', id='xxx')
soup.find('a', id=compile(r'xxx'))
注意:find只能找到符合要求的第一个标签,他返回的时一个对象
(4).find_all方法
返回一个列表,列表里时所有符合要求的对象
soup.find_all('a')
soup.find_all(['a','span']) #返回所有的a和span标签
soup.find_all('a', class_='xxx')
soup.find_all('a', id=compile(r'xxx'))
# 提取出前两个符合要求的
soup.find_all('a', limit=2)
(5).select方法
返回列表。类似CSS写法来筛选元素,标签名不加任何修饰,类名加点,id名加#
<1> 通过标签名查找
soup.select('a')
soup.select('a, span') # 注意引号的位置
<2> 通过类名查找
soup.select('.class')
<3> 通过id名查找
soup.select('#id')
<4> 通过子标签查找
# 直接子元素(必须相邻)
soup.select('body > div >a')
# 间接子元素(不需相邻)
soup.select('body a')
<5> 组合查找
标签名、类名、id名进行组合,空格隔开
soup.select('a #id')
<6> 属性查找
soup.select('a[href="https://www.baidu.com"]')
参考文档:
Beautiful Soup 4.4.0 文档
爬虫—bs4语法
更新中…