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 的学习和开发都具有重要意义。