Python 3.x 中如何使用beautifulsoup模块进行网页解析

1. 网页解析介绍

在我们浏览网页的时候,电脑会将网页上的 HTML 代码和 CSS 样式文件解析成我们所能够看到的网页页面。对于 Python 来说,如果需要获取网页上的数据,就需要使用到网页解析技术。网页解析是指将 HTML 或 XML 文档解析成树形结构,以便于对文档结构进行操作和查询。Python 中有许多网页解析库,如 lxml、html5lib 等,本文将介绍其中一种 - beautifulsoup。

2. beautifulsoup 简介

BeautifulSoup 是 Python 中一个独立的、持续的、去除疼痛的 HTML 和 XML 解析库。它可以帮助我们简单又快速的实现网页数据的提取和处理。

为了使用 BeautifulSoup,需要先安装这个库。接下来的代码演示如何使用 pip 安装该库。

pip install beautifulsoup4

2.1 beautifulsoup 的基本使用

下面是一个简单的 Python 程序,用于解析 HTML 文档:

from bs4 import BeautifulSoup

# HTML文档

html_doc = "这是一个演示页面

这是演示页面的正文"

# 创建BeautifulSoup对象

soup = BeautifulSoup(html_doc, 'html.parser')

# 获取页面的标题

print(soup.title.string)

# 获取页面的正文内容

print(soup.p.string)

输出如下:

这是一个演示页面

这是演示页面的正文

在上面的代码中,我们首先导入了 BeautifulSoup 库,然后创建了一个 HTML 文档,然后使用 BeautifulSoup() 方法将它转换成一个 BeautifulSoup 对象。再通过 soup.title.string 和 soup.p.string 属性获取了 HTML 文档中的 title 和 p 标签的内容。

2.2 解析 HTML 文件

下面是一个解析 HTML 文件的示例:

首先需要准备一个 HTML 文件,假设我们已经将这个 HTML 文件保存在本地,并命名为 test.html。然后通过以下代码将其读取:

from bs4 import BeautifulSoup

# 读取本地HTML文件

html_file = open('test.html','r', encoding='utf-8')

content = html_file.read()

# 关闭文件

html_file.close()

# 创建 BeautifulSoup 对象

soup = BeautifulSoup(content, 'html.parser')

# 打印出所有的链接

for link in soup.find_all('a'):

print(link.get('href'))

输出如下:

http://www.python.org/

http://www.google.com/

http://www.bing.com/

在上面的代码中,我们首先使用 open() 方法读取了本地的HTML文件,并通过 BeautifulSoup() 方法将其转换成了一个 BeautifulSoup 对象。然后使用 find_all() 方法获取了 HTML 文档中所有的链接,最后使用 get() 方法获取链接对应的 href 属性。

2.3 解析网页

在实际应用中,更多时候我们需要解析网页中的数据。下面是一个解析网页的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 打印出所有的链接

for link in soup.find_all('a'):

print(link.get('href'))

输出如下:

http://www.baidu.com/gaoji/preferences.html

http://www.baidu.com/more/

http://jianyi.baidu.com/

http://www.baidu.com/duty/

http://www.baidu.com/about/

在上面的代码中,我们首先使用 request 库获取了一个网页,然后通过 BeautifulSoup() 方法将返回的内容转换成了一个 BeautifulSoup 对象。最后,我们使用 find_all() 方法获取了 HTML 文档中的所有链接,然后打印出了这些链接的 href 属性。

2.4 解析 XML 文件

除了解析 HTML 文件和网页外,BeautifulSoup 还可以用来解析 XML 文件。下面是一个解析 XML 文件的示例:

首先需要准备一个 XML 文件,假设我们已经将这个 XML 文件保存在本地,并命名为 test.xml。然后通过以下代码将其读取:

from bs4 import BeautifulSoup

# 读取本地XML文件

xml_file = open('test.xml','r', encoding='utf-8')

content = xml_file.read()

# 关闭文件

xml_file.close()

# 创建 BeautifulSoup 对象

soup = BeautifulSoup(content, 'xml')

# 打印出所有的电影名称

for name in soup.find_all('name'):

print(name.string)

输出如下:

肖申克的救赎

这个杀手不太冷

教父

阿甘正传

在上面的代码中,我们首先使用 open() 方法读取了本地的 XML 文件,并通过 BeautifulSoup() 方法将其转换成了一个 BeautifulSoup 对象。然后使用 find_all() 方法获取了 XML 文档中的所有 name 标签,最后打印出了这些标签的内容。

3. beautifulsoup 的常用方法

除了前面所介绍的方法,BeautifulSoup 还提供了许多其他方法,如 find()、find_all()、select()、parent、next_sibling 等。下面将对一些常用的方法进行介绍:

3.1 find() 方法

find() 方法是 BeautifulSoup 中最常用的方法之一,它用于在 HTML 文档中查找指定的标签。

find() 方法的语法如下:

soup.find(name, attrs, recursive, string, **kwargs)

参数说明:

- name:指定要查找的标签名称,可以是字符串、正则表达式或列表。

- attrs:指定要查找的标签属性,可以使用字典、正则表达式或关键字参数等。

- recursive:指定是否递归查找子标签,该参数默认为 True。

- string:指定要查找的标签内容,可以是字符串、正则表达式或可调用对象。

- **kwargs:指定要查找的标签属性,支持关键字参数的语法。

下面是一个使用 find() 方法查找 HTML 文档中的所有链接的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 查找a标签

for link in soup.find_all('a'):

print(link.get('href'))

输出如下:

http://www.baidu.com/gaoji/preferences.html

http://www.baidu.com/more/

http://jianyi.baidu.com/

http://www.baidu.com/duty/

http://www.baidu.com/about/

在上面的代码中,我们使用了 find() 方法查找 HTML 文档中的所有链接,并通过 get() 方法获取了这些链接的 href 属性。

3.2 find_all() 方法

find_all() 方法与 find() 方法类似,不同的是它返回的是一个 Tag 类型的列表,而不是单个标签。

find_all() 方法的语法如下:

soup.find_all(name, attrs, recursive, string, limit, **kwargs)

参数说明:

- name:指定要查找的标签名称,可以是字符串、正则表达式或列表。

- attrs:指定要查找的标签属性,可以使用字典、正则表达式或关键字参数等。

- recursive:指定是否递归查找子标签,该参数默认为 True。

- string:指定要查找的标签内容,可以是字符串、正则表达式或可调用对象。

- limit:指定返回的最大数量,该参数默认为 None。

- **kwargs:指定要查找的标签属性,支持关键字参数的语法。

下面是一个使用 find_all() 方法查找 HTML 文档中的所有段落(p)标签的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 查找所有的段落

for p in soup.find_all('p'):

print(p)

输出如下:

<p class="soutu-btn Western-font"></p>

<p class="s-back-change"></p>

<p class="bri">这里是百度的搜索结果页面,您可以在这里快速找到需要的信息,还可以查看热门搜索、最新搜索等功能,帮助您全面了解搜索行业动态。</p>

在上面的代码中,我们使用了 find_all() 方法查找 HTML 文档中的所有段落(p)标签,然后打印出了这些标签的内容。

3.3 select() 方法

select() 方法用法类似于 find_all() 方法,也是用于查找符合条件的标签。不同之处在于 select() 方法支持 CSS 选择器语法,而不是像 find() 方法那样只支持字符串和正则表达式。

select() 方法的语法如下:

soup.select(css_selector)

参数说明:css_selector 是一个 CSS 选择器,它使用 HTML 标记属性来查找标签。

下面是一个使用 select() 方法查找 HTML 文档中所有标题标签的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 查找所有的标题

for title in soup.select('h1, h2, h3, h4, h5, h6'):

print(title)

输出如下:

<h1 class="s-title-inner"></h1>

<h2 class="s-bottom-channel-name"></h2>

在上面的代码中,我们使用了 select() 方法查找 HTML 文档中的所有标题标签,并打印出了这些标签的内容。

3.4 parent 属性

除了查找标签外,BeautifulSoup 还提供了许多属性来查询和操作标签的关系。其中 parent 属性可以用来访问一个标签的直接父标签。下面是一个使用 parent 属性查找 HTML 文档中所有链接的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 查找所有的链接

for link in soup.find_all('a'):

print(link.parent)

输出如下:

<p class="s_form"><!--es S_bse--><input class="s_ipt" name="wd" autocomplete="off" maxlength="255" value="" title="输入关键字" autofocus=""></p>

<p class="bg s_ipt_wr" id="search-input-wrapper"><a href="#" class="s_icon_ugc s_icon">意见反馈</a></p>

<p id="rs"></p>

......

在上面的代码中,我们使用了 parent 属性查找 HTML 文档中所有链接的父标签,并打印出了这些父标签的内容。

3.5 next_sibling 属性

next_sibling 属性用于访问一个标签的下一个兄弟标签。下面是一个使用 next_sibling 属性查找 HTML 文档中所有段落标签的下一个兄弟标签的示例:

from bs4 import BeautifulSoup

import requests

# 获取一个网页

response = requests.get("https://www.baidu.com/")

# 将网页的内容传递给BeautifulSoup对象

soup = BeautifulSoup(response.text, 'html.parser')

# 查找所有的段落

for p in soup.find_all('p'):

print(p.next_sibling)

输出如下:

<h3 class="s-bottom-line"><a href="http://www.baidu.com/gaoji/preferences.html">高级搜索</a></h3>

这里是百度的搜索结果页面,您可以在这里快速找到需要的信息,还可以查看热门搜索、最新搜索等功能,帮助您全面了解搜索行业动态。

<div class="s_view_container"></div>

......

在上面的代码中,我们使用了 next_sibling 属性查找 HTML 文档中所有段落标签的下一个兄弟标签,并打印出了这些兄弟标签的内容。

4. 总结

本文介绍了如何使用 Python 中的 beautifulsoup 库进行网页解析。我们首先介绍了 beautifulsoup 的基本使用方法,包括解析 HTML 文件和网页、解析 XML 文件等。然后介绍了 beautifulsoup 常用的方法,包括 find()、find_all()、select()、parent、next_sibling 等。最后,我们通过示例演示了如何使用这些方法来查找 HTML 文档中的标签,并输出其内容。使用 beautifulsoup 可以非常方便地从网页中提取数据,对于 Python 的学习和开发都具有重要意义。

后端开发标签