简单来说,BeautifulSoup就是Python的一个HTML或XML的解析库,我们可以用它来方便地从网页中提取数据,官方的解释如下:
BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时你仅仅需要说明一下原始编码方式就可以了。BeautifulSoup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
所以说,利用它我们可以省去很多繁琐的提取工作,提高解析效率。
from bs4 import BeautifulSoup
html="""
<html>
<body>
<a id="aaa" href='http://www.baidu.com' name='aaa'
class="aaa">百度一下</ a>
< a href='http://www.baidu.com'>百度一下2</ a>
<h1>大家好</h1>
</body>
</html>
"""
实例化。参数1被解析html源代码。参数2解析器。 1)内置的html包的parser.py 2)c语言写的被封装为python调用的lxml包。
html.parser内置包负责解析html源代码,把数据放到bs对象中,bs对象再取数据。
bs=BeautifulSoup(html,'html.parser')
# 取数据
print(bs.a) #取标签
print(bs.a['href']) #取标签属性值
print(bs.a.string) #取标签内容
print(bs.body.children)
print("-----------------------------------")
print(bs.find('a'))
print(bs.find_all) #如果要查询所有的标签,则需要使用find()和find_all()
print(bs.find_all('a',limit=1)[0]) #limit 是取前x项的意思,find()实际等于limit=1的情况,只是find_all()返回的是列表
print(bs.find_all(lambda tag: len(tag.attrs) == 2)) #BS4允许我们把特定函数类型当做findAll函数的参数,唯一的限制是这些函数必须把一个标签当做参数且返回结果为bool类型
print(bs.find_all('a', {"class" : "aaa"})) #可以通过这个attrs去更加详细地过滤标签,限制了标签为a,且属性中的class = sister
print("------------------------------------")
print(bs.title)
print(bs.a.string) #.string 即可获得标签内部的文字
print(type(bs.a.string)) #检查一下它的类型
print(type(bs.a)) #类型
print(type(bs.name)) #类型
print(bs.name) #名称
print("-------------------------------------")
print(bs.attrs) #属性 是字典
print(bs.a.attrs) #我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a.get('class')) #利用get方法,传入属性的名称,二者是等价的
bs.a['class']="newClass" #对这些属性和内容等等进行修改
print(bs.a.get('class'))
del bs.a['class'] #对这个属性进行删除
print(bs.a)
<a class="aaa" href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>
http://www.baidu.com
百度一下
<list_iterator object at 0x000001B5EAB327B8>
-----------------------------------
<a class="aaa" href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>
<bound method Tag.find_all of
<html>
<body>
<a class="aaa" href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>
< a href='http://www.baidu.com'>百度一下2</body></html>
<h1>大家好</h1>
>
<a class="aaa" href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>
[]
[<a class="aaa" href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>]
------------------------------------
None
百度一下
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'str'>
[document]
-------------------------------------
{}
{'id': 'aaa', 'href': 'http://www.baidu.com', 'name': 'aaa', 'class': ['aaa']}
['aaa']
newClass
<a href="http://www.baidu.com" id="aaa" name="aaa">百度一下</a>