BeautifulSoup4 的使用

待测试的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dot = """
<html><head><title>dotcpp</title></head>
<body>
<p><b>c语言网</b></p>
<p>编程网站
<a href="https://www.dotcpp.com/" id="link1">home</a>,
<a href="https://blog.dotcpp.com/" id="link2">blog</a>
<a href="https://www.dotcpp.com/oj/problemset.html" id="link3">oj</a></p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(dot,"html.parser") # 采用Python中自带的html.parser
print(soup.prettify()) # 换行,美观
print(soup.title) # 获取title标签的所有内容
print(soup.title.name) # 获取title标签的名字
print(soup.title.string) # 获取title标签的文本内容
print(soup.head) # 获取head标签的所有内容
print(soup.div)# 获取第一个div标签中的所有内容
print(soup.a) # 获取第一个a标签中的所有内容
print(soup.find_all("a")) # 获取所有的a标签,并遍历打印a标签中的href的值
print(soup.find(id = "dot")) # 获取id="dot"

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<html>
<head>
<title>
dotcpp
</title>
</head>
<body>
<p>
<b>
c语言网
</b>
</p>
<p>
编程网站
<a href="https://www.dotcpp.com/" id="link1">
home
</a>
,
<a href="https://blog.dotcpp.com/" id="link2">
blog
</a>
<a href="https://www.dotcpp.com/oj/problemset.html" id="link3">
oj
</a>
</p>
</body>
</html>
<title>dotcpp</title>
title
dotcpp
<head><title>dotcpp</title></head>
None
<a href="https://www.dotcpp.com/" id="link1">home</a>
[<a href="https://www.dotcpp.com/" id="link1">home</a>, <a href="https://blog.dotcpp.com/" id="link2">blog</a>, <a href="https://www.dotcpp.com/oj/problemset.html" id="link3">oj</a>]
None

注意解析html网页的解析方式,我们采用了Python中自带的html.parser,其实还可以选择 lxml HTML、lxml XML 和 html5lib 等解析器,他们分别有着优劣点。我们在使用BeautifulSoup的时候一定要注意的就是网页解析,正确的解析方式十分重要。

BeautifulSoup4 的四个对象

  1. Tag

​ 对应HTML中的标签。如上:

1
2
print(soup.title) # 获取title标签的名称
print(soup.a) # 获取所有的a标签中的所有内容

​ Tag 有两个属性,分别是 name 和 attrs,name 也就是标签的名字,attrs 对应 class、id 等信息。

​ 对应的是标签内部的文字

1
print(suop.title.string) # 获取标签的所有内容
  1. BeautifulSoup

​ 对应的是文档中的内容,它类似于一个特殊的标签,我们可以获取到它的类型、名称和属性。

1
soup = BeautifulSoup(html,"html.parser")
  1. Comment

​ 是一个特殊的NavigableSting对象,它输出的内容没有注释符号,如果不加以处理会影响我们对文档的解析,因为这种方式会忽略掉文档的注释,

​ 因此注释中的内容会以代码格式被解析出来,进而影响我们的后续操作,所有我们 一般会采用.string来输出内容。

遍历文档树

在解析文档文件的过程中,如果需要遍历文档,我们需要使用到一些特殊的方法。

  1. .contents

    ​ 获取Tag的所有子节点,以列表的形式返回。

    1
    2
    3
    con =  soup.head.contents
    for i in con:
    print(i)
  2. .children

​ 获取Tag的所有子节点,存储在一个生成器中,可以直接通过遍历的方式来访问,和上面例子一致。

  1. .descendants

​ 获取Tag的所有子孙节点。

  1. .strings

​ 获取子孙节点中的所有内容,可以通过遍历的方式来访问。

  1. .parent

​ 获取到Tag标签的父节点。

  1. .parents

​ 递归得到所有父辈节点,存放在一个生成器中,可以通过遍历的方式来访问。

  1. .previous_siblings

​ 获取Tag上面的所有兄弟节点,返回生成器。

  1. .next_siblings

​ 获取Tag下面的所有兄弟节点,返回生成器。

​ 9. .has_attr

​ 用于判断Tag是否包含属性。

搜索文档数

​ 我们在使用的过程中如果要匹配到搜索内容的全部信息,这时候就需要搜索整个文档树,我们需要采用到find_all方法,这个过滤器能贯穿整个搜索的AIP,它可以使用在tag的name中。

语法格式:

1
find_all( name , attrs , recursive , text , **kwargs )

name参数即tag的名字,attrs为类或id,recursive为递归性,text为文本参数。