在 HTML 文档中频繁出现的标签之一是 <p>
标签,它标记了一段文本。使用 Beautiful Soup,你可以轻松地从解析后的文档树中提取段落。在本章中,我们将讨论使用 BeautifulSoup 库抓取段落的以下几种方式。
-
-
使用
find_all()
方法抓取 HTML 段落
-
我们将使用以下 HTML 文档来进行这些练习:
<html>
<head>
<title>BeautifulSoup - Scraping Paragraph</title>
</head>
<body>
<p id='para1'>The quick, brown fox jumps over a lazy dog.</p>
<h2>Hello</h2>
<p>DJs flock by when MTV ax quiz prog.</p>
<p>Junk MTV quiz graced by fox whelps.</p>
<p>Bawds jog, flick quartz, vex nymphs.</p>
</body>
</html>
通过 <p>
标签抓取
搜索解析树最简单的方法是通过其名称搜索标签。因此,表达式 soup.p
指向范围内的文档中的第一个 <p>
标签。
para = soup.p
为了获取后续的所有 <p>
标签,你可以运行一个循环直到 soup
对象中没有 <p>
标签为止。下面的程序展示了所有段落标签的格式化输出。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
para = soup.p
print (para.prettify())
while True:
p = para.find_next('p')
if p is None:
break
print (p.prettify())
para=p
输出
<p>
The quick, brown fox jumps over a lazy dog.
</p>
<p>
DJs flock by when MTV ax quiz prog.
</p>
<p>
Junk MTV quiz graced by fox whelps.
</p>
<p>
Bawds jog, flick quartz, vex nymphs.
</p>
使用 find_all()
方法
find_all()
方法更为全面。你可以向此方法传递各种类型的过滤器,如标签、属性或字符串等。在这种情况下,我们希望获取 <p>
标签的内容。
在下面的代码中,find_all()
方法返回 <p>
标签中的所有元素的列表。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
paras = soup.find_all('p')
for para in paras:
print (para.prettify())
输出
<p>
The quick, brown fox jumps over a lazy dog.
</p>
<p>
DJs flock by when MTV ax quiz prog.
</p>
<p>
Junk MTV quiz graced by fox whelps.
</p>
<p>
Bawds jog, flick quartz, vex nymphs.
</p>
我们可以使用另一种方法来查找所有的 <p>
标签。首先,使用 find_all()
获取所有标签的列表,并检查每个标签的 Tag.name
是否等于 'p'
。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tags = soup.find_all()
paras = [tag.contents for tag in tags if tag.name=='p']
print (paras)
find_all()
方法也有 attrs
参数。当你想提取具有特定属性的 <p>
标签时,这是有用的。例如,在给定的文档中,第一个 <p>
元素有 id='para1'
。为了获取它,我们需要修改标签对象如下:
paras = soup.find_all('p', attrs={'id':'para1'})
使用 select()
方法
select()
方法主要用于使用 CSS 选择器获取数据。然而,你也可以向它传递一个标签。在这里,我们可以将 <p>
标签传递给 select()
方法。select_one()
方法也是可用的。它获取 <p>
标签的第一个出现。
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
paras = soup.select('p')
print (paras)
输出
[
<p>The quick, brown fox jumps over a lazy dog.</p>,
<p>DJs flock by when MTV ax quiz prog.</p>,
<p>Junk MTV quiz graced by fox whelps.</p>,
<p>Bawds jog, flick quartz, vex nymphs.</p>
]
为了筛选出具有特定 id
的 <p>
标签,可以使用如下所示的 for
循环:
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tags = soup.select('p')
for tag in tags:
if tag.has_attr('id') and tag['id']=='para1':
print (tag.contents)
输出
['The quick, brown fox jumps over a lazy dog.']