使用 BeautifulSoup 在 HTML 文档中查找具有给定属性值的标签


从 HTML 页面提取数据是网络爬虫过程中的一项典型活动。HTML 页面中发现的许多标签和属性有助于定位和提取相关数据。一个名为 BeautifulSoup 的知名 Python 模块可用于解析 HTML 文本并提取有用的信息。在本教程中,我们将重点关注使用 BeautifulSoup 来查找具有特定属性值的标签。

安装和设置

为了开始,我们必须安装 BeautifulSoup。可以使用 Python 的软件包安装程序 Pip 来完成此操作。以下命令应输入到命令窗口或终端中:

pip install beautifulsoup4

安装完成后,我们可以在 Python 代码中使用以下语句导入 BeautifulSoup:

from bs4 import BeautifulSoup

语法

使用 BeautifulSoup 查找具有给定属性值的标签的语法如下:

soup.find(tag_name, attrs={attribute_name: attribute_value})

这里,soup 指的是包含已解析 HTML 内容的 BeautifulSoup 对象,tag name 指的是我们正在查找的标签,attribute name 指的是我们正在查找的属性,attribute value 指的是我们正在匹配的值。

算法

  • 使用 BeautifulSoup 解析 HTML 文档

  • 使用 find() 方法查找具有给定属性值的标签

  • 从标签中提取所需数据

示例 1

要查找具有类 "important" 的段落标签,我们可以使用以下代码:

from bs4 import BeautifulSoup

html_doc="""<html>
   <body>
      <p class="important">Fancy content here, just a test</p>
      <p>This is a normal paragraph</p>
   </body>
</html>"""

soup = BeautifulSoup(html_doc, 'html.parser')
tag = soup.find('p', attrs={'class': 'important'})
print(tag)

输出

<p class="important">Fancy content here, just a test</p>

soup 是包含已解析 HTML 文档的 BeautifulSoup 对象,'p' 是我们想要查找的标签名称,'class' 是我们想要搜索的属性的名称,'important' 是我们想要匹配的属性的值。find() 方法返回第一个匹配给定条件的标签,在本例中,是第一个具有类 "important" 的段落标签。

示例 2

要查找 id 为 "content" 的 div 标签内的第一个段落标签,我们可以使用以下代码:

from bs4 import BeautifulSoup
html_doc = """<html>
<body>
   <div id="header">
      <h1>Welcome to my website</h1>
      <p>All the help text needed will be in this paragraph</p>
   </div>
   <div id="content">
      <h2>Section 1</h2>
      <p>Content of section 1 goes here</p>
      <h2>Section 2</h2>
      <p>Content of section 2 goes here</p>
   </div>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
div_tag = soup.find('div', attrs={'id': 'content'})
tag = div_tag.find('p')
print(tag)

输出

<p>Content of section 1 goes here</p>

这里,soup 是包含已解析 HTML 文档的 BeautifulSoup 对象,'div' 是我们想要查找的标签名称,'id' 是我们想要搜索的属性的名称,'content' 是我们想要匹配的属性的值。find() 方法返回第一个匹配给定条件的 div 标签,在本例中,是 id 为 "content” 的 div 标签。

示例 3

from bs4 import BeautifulSoup
html_doc="""<html>
<body>
   <h1>List of Books</h1>
   <table>
      <tr>
         <th>Title</th>
         <th>Author</th>
         <th>Price</th>
      </tr>
      <tr>
         <td><a href="book1.html">Book 1</a></td>
         <td>Author 1</td>
         <td>$10</td>
      </tr>
      <tr>
         <td><a href="book2.html">Book 2</a></td>
         <td>Author 2</td>
         <td>$15</td>
      </tr>
      <tr>
         <td><a href="book3.html">Book 3</a></td>
         <td>Author 3</td>
         <td>$20</td>
      </tr>
   </table>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
price_tag = soup.find('td', text='$15')
book_tag = price_tag.find_previous('td').find_previous('td').find_previous('td')
title = book_tag.text
author =  book_tag.find_next('td').text
print(title, author)

输出

$10 Book 2

这里,"soup" 指的是包含已解析 HTML 内容的 BeautifulSoup 对象,"td" 代表我们正在查找的标签名称,"text" 代表我们正在尝试匹配的文本,"$15" 代表该文本的值。在本例中,find() 函数返回第一个符合指定条件的 td 标签,即包含字符串 "$15" 的 td 标签。

然后,使用 find previous() 函数查找包含书籍标题和 href 属性的 td 元素。此方法在文档树中向后查找,直到找到第一个符合指定条件的标签,该标签位于包含值 "$15" 的 td 标签之前。

由于我们拥有书籍标题标签,因此我们可以使用 text 属性来检索文本。下一步是使用 find next sibling() 函数查找包含作者名称的后续 td 标签。此方法返回书籍标题 td 标签之后的 td 标签,因为它是具有相同父标签的下一个兄弟标签。

应用

查找具有特定属性值的标签是一项常见的网络爬虫活动,可用于各种应用中。

  • 使用网站数据创建机器学习模型或进行数据分析

  • 电子商务网站抓取以获取产品信息和价格比较

  • 使用招聘网站抓取来分析和跟踪职位发布

此任务可以使用多种网络抓取技术、编程语言(如 Python 和 BeautifulSoup)以及其他工具来完成。在进行任何网络抓取之前,阅读网站的服务条款至关重要,因为某些网站可能已实施安全措施以防止抓取。

结论

本文介绍了 BeautifulSoup 的设置和安装,BeautifulSoup 是一个强大的 Python 模块,它使从 HTML 和 XML 文档中提取信息成为可能,介绍了用于识别具有给定属性值的特定标签的语法,并提供了有关如何在实际情况下正确使用这些技术的详细说明。

find()

find_all()

方法都已涵盖,以及如何在 HTML 页面中查找具有特定属性值的标签。BeautifulSoup 是一个灵活且强大的工具,它彻底改变了网络抓取的世界,并提供了大量的空间供进一步探索和实验。

更新于: 2023年8月21日

367 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告