使用Beautiful Soup找到第三个发生的`<p>`标签

时间:2016-05-10 22:25:44

标签: python html beautifulsoup

正如标题所示,我试图了解如何找到网站的第三个<p>(例如,我使用了以下网站:http://www.musicmeter.nl/album/31759)。

使用this question的答案,我尝试了以下代码

from bs4 import BeautifulSoup
import requests
html = requests.get("http://www.musicmeter.nl/album/31759").text    # get HTML from http://www.musicmeter.nl/album/31759
soup = BeautifulSoup(html, 'html5lib')                              # Get data out of HTML

first_paragraph = soup.find('p')    # or just soup.p

print "first paragraph:", first_paragraph

second_paragraph = first_paragraph.find_next_siblings('p')

print "second paragraph:", second_paragraph

third_paragraph = second_paragraph.find_next_siblings('p')

print "third paragraph:", third_paragraph

但是这段代码会导致third_paragraph出现以下错误:

Traceback (most recent call last):
  File "page_109.py", line 21, in <module>
    third_paragraph = second_paragraph.find_next_siblings('p')
AttributeError: 'ResultSet' object has no attribute 'find_next_siblings'

我试图查找错误,但我无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:2)

.find_next_siblings('p')返回一个BeautifulSoup结果集,就像python中的列表一样。请尝试使用以下代码。

first_paragraph = soup.find('p')
siblings = first_paragraph.find_next_siblings('p')
print "second paragraph:", siblings[0]
print "third paragraph:", siblings[1]

答案 1 :(得分:2)

你正在使用兄弟姐妹,即复数,所以你得到一个 ResultSet / list ,你不能打电话给 .find_next_siblings

如果您想要每个下一段,您将使用兄弟而不是兄弟

second_paragraph = first_paragraph.find_next_sibling('p')

print "second paragraph:", second_paragraph

third_paragraph = second_paragraph.find_next_sibling('p')

哪个可以链接:

third_paragraph = soup.find("p").find_next_sibling('p').find_next_sibling("p")

更简单的方法是使用 nth-of-type

print(soup.select_one("p:nth-of-type(3)"))

您还应该知道找到第三个发生的 p 与找到您在页面上找到的第一个 p 的第二个兄弟是不一样的,使用如果第一个 p 没有两个兄弟 p 标签然后你的逻辑就会失败。

要使用查找逻辑真正获得第三个p,只需使用 find_next

  third_paragraph = soup.find("p").find_next('p').find_next("p")

如果您希望前三个使用find_all并将限制设置为3:

 soup.find_all("p", limit=3)

使用原始逻辑获得前两个:

first_paragraph = soup.find('p')    # or just soup.p



second, third = first_paragraph.find_next_siblings("p", limit=2)

如果您只想要x个标签,那么只需解析x标签,请确保您了解找到第三个​​<p>标记和第二个兄弟标记之间的区别第一个p标签,因为它们可能不同。