Beautiful Soup - 从HTML中抓取段落



HTML文档中经常出现的标签之一是<p>标签,它标记段落文本。使用Beautiful Soup,您可以轻松地从解析的文档树中提取段落。本章将讨论使用BeautifulSoup库抓取段落的几种方法。

  • 使用<p>标签抓取HTML段落

  • 使用find_all()方法抓取HTML段落

  • 使用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>

通过<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.']
广告
© . All rights reserved.