Beautiful Soup 简明教程

Beautiful Soup - Scraping Paragraphs from HTML

HTML 文档中经常出现的标记之一是标记段落文本的 <p> 标记。使用 Beautiful Soup,你可以轻松地从解析的文档树中提取段落。在本章中,我们将讨论借助 BeautifulSoup 库抓取段落的以下方法。

  1. 用 <p> 标记抓取 HTML 段落

  2. 用 find_all() 方法抓取 HTML 段落

  3. 用 select() 方法抓取 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>

Scraping by <p> tag

搜索解析树的最简单方法是按名称搜索标签。因此,表达式 soup.p 指向 scouped 文档中的第一个 <p> 标签。

para = soup.p

若要获取所有后续 <p> 标签,您可以运行循环,直到所有 <p> 标签都被 soup 对象用尽。以下程序显示所有段落标签的美化输出。

Example

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

Output

<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>

Using find_all() method

find_all() 方法更为全面。您可以将各种类型的过滤器(例如,标签、属性或字符串等)传递给此方法。在本例中,我们希望获取 <p> 标签的内容。

在以下代码中,find_all() 方法返回 <p> 标签中所有元素的列表。

Example

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())

Output

<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'。

Example

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'})

Using select() method

select() 方法本质上用于使用 CSS 选择器获取数据。但是,您还可以向其传递一个标签。在这里,我们可以将 <p> 标签传递给 select() 方法。select_one() 方法也可用。它获取 <p> 标签的第一个匹配项。

Example

from bs4 import BeautifulSoup

fp = open('index.html')

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

paras = soup.select('p')
print (paras)

Output

[
<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 循环:

Example

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)

Output

['The quick, brown fox jumps over a lazy dog.']