来自BeautifulSoup的使用nextSibling的问题

时间:2011-04-17 00:47:13

标签: python beautifulsoup

我正在尝试使用BeautifulSoup:

<h4>Hello<br /></h4>
<p><img src="http://url.goes.here" alt="hiya" class="img" />May 28, 1996</p>

对于此示例,假设我在变量<h4>中保存了tag标记。当我输入print tag.text时,输出为Hello,正如所料。

然而,当我使用print tag.nextSibling时,输出什么都没有。当我输入print tag.nextSibling.nextSibling时,输出为<p><img src="http://url.goes.here" alt="hiya" class="img" />May 28, 1996</p>。到底是怎么回事?为什么我必须加倍使用.nextSibling来获取示例中的<p>标记?这始终是一个错误。

2 个答案:

答案 0 :(得分:3)

显然,.nextSibling 抓取白色文字。因此,在我正在使用的实际页面中,<h4><p>标记之间有白色文字,这就是我必须加倍的原因。

<强>证据

写作:

print tag.__class__
print tag.nextSibling.__class__
print tag.nextSibling.nextSibling.__class__

收率:

<class 'BeautifulSoup.Tag'>
<class 'BeautifulSoup.NavigableString'>
<class 'BeautifulSoup.Tag'>

答案 1 :(得分:2)

以下是官方文档中的内容: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#going-down

在真实文档中,标记的.next_sibling或.previous_sibling通常是包含空格的字符串。回到“三姐妹”文件:

<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>

您可能认为第一个标记的.next_sibling是第二个标记。但实际上,它是一个字符串:逗号和换行符将第一个标记与第二个标记分开:

link = soup.a
link
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

link.next_sibling
# u',\n'

第二个标记实际上是逗号的.next_sibling:

link.next_sibling.next_sibling
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>