Web 页面通常包含以有序或无序列表形式呈现的重要数据。使用 Beautiful Soup,我们可以轻松地提取 HTML 列表元素,将数据带入 Python 对象中存储到数据库中以便进一步分析。在本章中,我们将使用 find()
和 select()
方法从 HTML 文档中抓取列表数据。
搜索解析树最简单的方法是通过其名称搜索标签。soup.<tag>
获取给定标签的内容。
HTML 提供了 <ol>
和 <ul>
标签来组成有序和无序列表。像其他标签一样,我们也可以获取这些标签的内容。
我们将使用以下 HTML 文档:
<html>
<body>
<h2>Departmentwise Employees</h2>
<ul id="dept">
<li>Accounts</li>
<ul id='acc'>
<li>Anand</li>
<li>Mahesh</li>
</ul>
<li>HR</li>
<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>
</ul>
</body>
</html>
通过 Tag 抓取列表
在上述 HTML 文档中,我们有一个顶层的 <ul>
列表,在其内部还有一个 <ul>
标签和另一个 <ol>
标签。我们首先在 soup
对象中解析文档并检索第一个 <ul>
的内容到 soup.ul
Tag 对象中。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
lst = soup.ul
print(lst)
输出
<ul id="dept">
<li>Accounts</li>
<ul id="acc">
<li>Anand</li>
<li>Mahesh</li>
</ul>
<li>HR</li>
<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>
</ul>
改变 lst
的值使其指向 <ol>
元素以获取内部列表。
lst = soup.ol
输出
<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>
使用 select()
方法
select()
方法主要用于使用 CSS 选择器获取数据。然而,你也可以向它传递一个标签。在这里,我们可以将 ol
标签传递给 select()
方法。select_one()
方法也是可用的。它获取给定标签的第一个出现。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
lst = soup.select("ol")
print(lst)
输出
[<ol id="HR">
<li>Rani</li>
<li>Ankita</li>
</ol>]
使用 find_all()
方法
find()
和 find_all()
方法更为全面。你可以向这些方法传递各种类型的过滤器,如标签、属性或字符串等。在这种情况下,我们希望获取列表标签的内容。
在下面的代码中,find_all()
方法返回 <ul>
标签中的所有元素的列表。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
lst = soup.find_all("ul")
print(lst)
我们可以通过包含 attrs
参数来细化搜索过滤器。在我们的 HTML 文档中,<ul>
和 <ol>
标签指定了它们各自的 id
属性。所以,让我们获取 id="acc"
的 <ul>
元素的内容。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
lst = soup.find_all("ul", {"id":"acc"})
print(lst)
输出
[<ul id="acc">
<li>Anand</li>
<li>Mahesh</li>
</ul>]
这里还有一个例子。我们收集所有带有 <li>
标签且内部文本以 'A' 开头的元素。find_all()
方法接受一个关键字参数 string
。如果 startswith()
函数返回 True
,则它采用文本的值。
示例
from bs4 import BeautifulSoup
def startingwith(ch):
return ch.startswith('A')
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
lst = soup.find_all('li', string=startingwith)
print(lst)
输出
[<li>Accounts</li>, <li>Anand</li>, <li>Ankita</li>]