提取与beautifulsoup之间的文本,但没有下一个标签

时间:2015-01-07 07:42:05

标签: python html web-scraping beautifulsoup html-parsing

我正在使用python + beautifulsoup来尝试获取br之间的文本。我最接近的是通过以下方式使用next_sibling:

<html>
<body>
</a><span class="strong">Title1</span>
<p>Text1</p>
<br>The Text I want to get<br>
<p>Text I dont want</p>
</body>
</html>

for span in soup.findAll("span", {"class" : "strong"}):
    print(span.next_sibling.next_sibling.text)

但这会打印出来:

The Text I want to getText I dont want

所以我想要的是在第一个p之后,但在第二个之前,但我无法弄清楚当没有真正的标签时如何提取,只有br作为参考。

我需要它打印:

The Text I want to get

2 个答案:

答案 0 :(得分:3)

由于您提供的 HTML已损坏,因此行为会与BeautifulSoup使用的parser to parser不同。

如果是lxml parserBeautifulSoup会将br标记转换为自动关闭标记:

>>> soup = BeautifulSoup(data, 'lxml')
>>> print soup
<html>
<body>
<span class="strong">Title1</span>
<p>Text1</p>
<br/>The Text I want to get<br/>
<p>Text I dont want</p>
</body>
</html>

请注意,您需要安装lxml。如果你没问题 - 找到br并获得下一个兄弟:

from bs4 import BeautifulSoup

data = """your HTML"""
soup = BeautifulSoup(data, 'lxml')

print(soup.br.next_sibling)  # prints "The Text I want to get"

另见:

答案 1 :(得分:0)

使用Python Scrapy

In [4]: hxs.select('//body/text()').extract()
Out[4]: [u'\n', u'\n', u'\n', u'The Text I want to get', u'\n', u'\n']