python网络爬虫开发:BeautifulSoup网页解析库

BeautifulSoup在Python中是一个比较受欢迎的第三方库,它是一款比较优秀的网页解析库,里面提供了很多接口帮助我们来处理导航、搜索、修改分析树,它的查找提取功能非常好用,能够节省程序员大量的时间。

BeautifulSoup最新版为BeautifulSoup4,我们可以通过pip来安装,也可以在Pycharm中直接找到进行下载。

python爬虫12

Pip安装过程如图:

python爬虫13

1. BeautifulSoup的使用

我们先通过一段代码来测试使用一下它的用法:

1
2
3
4
5
6
7
8
9
10
11
12
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")
print(soup.prettify())

输出结果为:

python爬虫14

我们可以通过这种方式来解析网页,我们还可以通过它来进一步获取更精确的信息,例如:

1
2
3
4
5
6
7
8
9
10
11
soup = BeautifulSoup(html,"html.parser"
print(suop.prettify())
print(suop.title)  # 获取title标签的所有内容
print(suop.title.name) # 获取title标签的名字
print(suop.title.string) # 获取title标签的文本内容
print(suop.head) # 获取head标签的所有内容
print(suop.div)# 获取第一个div标签中的所有内容
print(suop.div["id"]) # 获取第一个div标签的id的值
print(suop.a)  # 获取第一个a标签中的所有内容
print(suop.find_all("a")) # 获取所有的a标签,并遍历打印a标签中的href的值
print(suop.find(id = "dot")) # 获取id="dot"

输出结果即为对应的信息,注意解析html网页的解析方式,我们一直采用了Python中自带的html.parser,我们还可以选择lxml HTML、lxml XML和html5lib等解析器,他们分别有着优劣点,如果系统中有C语言库的可以选择下载前两者解析器,如果不想再下载过多插件的也可以直接选择我们上面用到的即可,我们在使用BeautifulSoup的时候一定要注意的就是网页解析,正确的解析方式十分重要。

2. BeautifulSoup4的四个对象

Beautiful Suop把网页中的信息转换成一个复杂的树形结构,通过子树分解为四个对象,分别是Tag、NavigableSting、BeautifulSoup、Comment。

1) Tag

Tag与它的对应的汉语一个意思,对应的就是HTML中的标签,像我们在上面使用到的:

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

他们都属于标签信息,我们可以通过标签名来获取到这些标签中的内容,有一点需要注意的是在查找的时候,对应的是符合要求的第一个标签,Tag有两个属性,分别是name和attrs,name也就是标签的名字,attrs对应class、id等信息。

2) NavigableSting

NavigableSting对应的是标签内部的文字,例如:

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

通过这种方式就可以直接获取到标签内部的文字。

3) BeautifulSoup

BeautifulSoup对象对应的是文档中的内容,它类似于一个特殊的标签,我们可以获取到它的类型、名称和属性,也就是上面我们所使用到的:

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

4) Comment

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

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

THE END