BS4模块-Beautiful Soup
什么是BS4?
是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
BS4的安装
pip install beautifulsoup4
BS4的导入
from bs4 import BeautifulSoup
BS4的解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
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”]) | 速度快,唯一支持xml的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性,以浏览器的方式 | 速度慢,不依赖外部拓展 |
在官方文档中推荐使用lxml作为解析器,因为效率更高。在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.
创建BeautifulSoup对象
#导入BS4的包
from bs4 import BeautifulSoup
#创建BeautifulSoup对象
#这里的html是爬取到的网页,"lxml"指的是选择器
soup = BeautifulSoup(html,"lxml")
BS中的四大对象
对象 | 属性 |
---|---|
Tag | 是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为soup.name,其中name是html下的标签。 |
BeautifulSoup | 整个html文本对象,可当作Tag对象. |
NavigableString | 标签内的文本对象 |
Comment | 是一个特殊的NavigableString对象,如果html标签内存在注释,那么它可以过滤掉注释符号保留注释文本 |
Tag属性的介绍
Tag对象:
from bs4 import BeautifulSoup
#创建一段html标签
html = '''
<b class="boldest">Extremely bold</b>
<ul>
<li>li</li>
</ul>
'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
print(type(tag))
#>>> 此处获取的就是b标签
# <b class="boldest">Extremely bold</b>
# <class 'bs4.element.Tag'
.name属性:每一个tag对象都有自己的名字,通过.name来获取
from bs4 import BeautifulSoup
#创建一段html标签
html = '''
<b class="boldest">Extremely bold</b>
<ul>
<li>li</li>
</ul>
'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
tag_name = tag.name
#打印出tag对象的名字
print(tag_name)
#打印出tag对象名字的类型
print(type(tag_name))
#>>> b
# <class 'str
更改tag.name的属性
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
#更改tag.name的值
tag.name = "genggai"
#过去tag,name
tag_name = tag.name
#打印出tag对象的名字
print(tag_name)
#打印出tag对象名字的类型
print(type(tag_name))
#>>> genggai
# <class 'str'>
如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档
attrs
attrs:像字典一样获取标签中的属性信息,attrs返回类型是字典类型
#创建一段html标签
html = '''
<b class="boldest" id="di1">Extremely bold</b>
<ul>
<li>li</li>
</ul>
'''
soup = BeautifulSoup(html,"lxml")
#创建一个tag对象
tag = soup.b
#获取tag中所有的信息
tag_dict = tag.attrs
#打印出attrs的值
print(tag_dict)
#打印出attrs返回的类型
print(type(tag_dict))
#>>> {'class': ['boldest'], 'id': 'di1'}
# <class 'dict'
属性定位
- soup.find(“tagName”,attrName=“value”):定位属性值tagName中attrName="value"的第一个标签
from bs4 import BeautifulSoup
html = """
<div class="boldest" id="di1">Extremely bold</div>
<ul>
<div class="boldest">没有id的div</div>
<li>li</li>
</ul>
"""
soup = BeautifulSoup(html,"lxml")
div_data = soup.find("div",class_="boldest")
print(div_data)
#只取到了第一个class值为boldest的标签
#>>> <div class="boldest" id="di1">Extremely bold</div
- soup.find_all(“tagName”,attrName=“value”):定位属性值tagName中attrName="value"的所有标签,返回值是一个集合
from bs4 import BeautifulSoup
html = """
<div class="boldest" id="di1">Extremely bold</div>
<ul>
<div class="boldest">没有id的div</div>
<li>li</li>
</ul>
"""
soup = BeautifulSoup(html,"lxml")
div_data = soup.find_all("div",class_="boldest")
print(div_data)
#>>> [<div class="boldest" id="di1">Extremely bold</div>, <div class="boldest">没有id的div</div
选择器定位
- soup.select(“css选择器”):定位css选择器选中的标签,返回值是一个列表
from bs4 import BeautifulSoup
html = """
<div class="boldest" id="di1">Extremely bold</div>
<ul>
<div class="boldest">没有id的div</div>
<li>li</li>
</ul>
"""
soup = BeautifulSoup(html,"lxml")
# #di1选择id为di1的标签
div_data = soup.select("#di1")
print(div_data)
#>>>[<div class="boldest" id="di1">Extremely bold</div
- 层级选择器:
类似于xpath中的/,只是在bs4中用>来表示,跨节点用空格表示,只不过bs4一定有一个层级的开始
from bs4 import BeautifulSoup
html = """
<div class="boldest" id="di1">Extremely bold
<ul>
<div class="boldest">没有id的div</div>
<li>li1</li>
<li>li2</li>
</ul>
</div>
"""
soup = BeautifulSoup(html,"lxml")
#层级选择器空格举例
data = soup.select("#di1 li")
# 取id为di1的标签下面ul标签里面li标签
div_data = soup.select("#di1 > ul > li")
print(div_data)
#两个取值的结果都是一样的
#>>>[<li>li1</li>, <li>li2</li>]
#>>>[<li>li1</li>, <li>li2</li>]