0%

BeautifulSoup4简介

毕业设计中有一同学用了BeautifulSoup4,之前也看到过这个库,但不知道是用来干嘛的,后来在看廖雪峰的商业爬虫时了解到,这个库也和Xpath一样,是用来解析DOM文档,在这里写篇博客简单介绍一下。

简介

Beautiful Soup 是一个可以从DOM文件(HTML或XML)中提取数据的Python库,和Xpath的作用类似,有官方中文文档

四大对象

BeautifulSoup将对象分为以下四类

Tag

Tag对象和XML或者HTML原生文档中的tag相同,如<a></a><div></div>。通过.name获取Tag对象

1
2
3
4
5
6
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
# 获取Tag对象
tag = soup.b
print(tag)
# 打印tag的类型
print(type(tag))

运行结果如下:

1
2
<b class="boldest">Extremely bold</b>
<class 'bs4.element.Tag'>

同时一个Tag可能有很多属性,Tag属性的操作方法与字典相同,多值属性通过列表的方式返回。也可用.attrs的方式获取到其属性的字典形式。

1
2
print(tag['class'])
print(tag.attrs)

运行结果如下:

1
2
boldest
{'class': ['boldest']}

一个 NavigableString 字符串与Python中的Unicode字符串相同,并且还支持包含在 遍历文档树 和 搜索文档树 中的一些特性。一般来说,NavigableString就是元素中的文本。如:

1
2
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(soup.b.string)

运行结果如下:

1
Extremely bold

BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法。
个人认为,BeautifulSoup对象就是用来承接DOM文档,并提供解析操作的对象。

Comment

Comment是一个特殊类型的NavigableString 对象,一般用来承接DOM中的注释部分。如:

1
2
3
4
5
markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
print(comment)
pirnt(type(comment))

运行结果如下:

1
2
Hey, buddy. Want to buy a used parser?
<class 'bs4.element.Comment'>

值得注意的是:一旦<b></b>标签内除了注释有其他的东西,比如其他标签或者文本,则comment的值为None,type为NoneType

常用的函数

find_all和find

查询所有符合条件的对象,以列表的形式返回。其函数头为:def find_all(self, name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs)
参数name为标签的名字。参数attrs为标签的属性,以字典的形式导入。参数recurive为True则表示递归查询。参数limit表示当查询到的结果为其值时停止查询。
find返回符合查询条件的第一个标签,本质还是调用find_all,不过是设置了limit=1

1
2
3
4
5
6
7
8
9
10
11
12
13
    html='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
</ul>
</div>
'''
soup=BeautifulSoup(html,features="lxml")
result=soup.find_all("li")
print(result)
result=soup.find_all("li",attrs={"class":"item-1"})
print(result)

运行结果如下:

1
2
[<li class="item-0"><a href="link1.html">first item</a></li>, <li class="item-1"><a href="link2.html">second item</a></li>]
[<li class="item-1"><a href="link2.html">second item</a></li>]

select和select_one

select和select_one都是以CSS选择器的语法找Tag,如:

1
2
3
4
result=soup.select(".item-1")
print(result)
result=soup.select("#item-a")
print(result)

运行结果如下:

1
2
[<li class="item-1"><a href="link2.html">second item</a></li>]
[<a href="link2.html" id="item-a">second item</a>]
-------------------本文结束 感谢阅读-------------------