美丽的汤使用extract()后无法获取get_text

时间:2015-07-05 19:34:47

标签: python beautifulsoup

我正在处理网络报废,我只想要来自任何网站的文字,所以我使用的是Beautiful Soup。最初我发现get_text()方法也返回JavaScript代码,以避免我遇到我应该使用extract()方法,但现在我有一个奇怪的问题,提取{{1}后} script标记style无法识别它的正文,即使它出现在新的`html中。

首先让我告诉你我正在做这件事

Beautiful Soup

此处soup = BeautifulSoup(HTMLRawData, 'html.parser') print(soup.body) 声明正在打印所有print数据 但是当我做的时候

html

现在它正在打印soup = BeautifulSoup(rawData, 'html.parser') for script in soup(["script", "style"]): script.extract() # rip it out print(soup.body) 因为元素不存在但是为了调试之后我做了None然后打印整个soup.prettify()包括html标签而且没有bodyscript标记:(现在我非常困惑,为什么会发生这种情况,如果style存在,那么为什么它body请说帮助谢谢

我正在使用Python 3和bs4,None是从网站上提取的html。

3 个答案:

答案 0 :(得分:4)

问题:使用此html示例:

<html>
<style>just style</style>
<span>Main text.</span>
</html>

在提取 style 标记并调用get_text()之后,它只返回它应该删除的文本。这是由于使用extract()后html中的双重换行符。在.extract()之前和之后调用soup.contents,你会看到这个问题。

extract()之前

[<html>\n<style>just style</style>\n<span>Main text.</span>\n</html>]

extract()之后:

[<html>\n\n<span>Main text.</span>\n</html>]

你可以看到html和span之间的双重换行符。这个问题由于某种未知原因而制动了get_text()。要验证此点,请删除示例中的换行符,它将正常工作。

<强>解决方案:

1 .- 在提取()调用后再次解析汤。

BeautifulSoup(str(soup), 'html.parser')

2 .- 使用其他解析器。

BeautifulSoup(raw, 'html5lib')

注意:如果您提取两个或多个连续标记,解决方案#2不起作用,因为您最终会再次使用双换行符。

注意:您可能需要安装此解析器。只是做:

pip install html5lib

答案 1 :(得分:0)

你能包含rawData的内容吗? 如果您的rawData类似于:

<script>...</script>
<script>...</script>
<style>...</style>

这很有道理。 X.extract()将从DOM树中删除该标记。

如果没有整个内容和整个代码,将很难提供帮助。

答案 2 :(得分:0)

这似乎是最新4.4.0版本中的一个错误。我有一个几乎完全相同的问题:分解(或提取)标签后:我无法访问下一个标签。

Miguel Sanchez的第一个答案是有效的,但它很慢!

回滚到BeautifulSoup 4.3.2解决了我的问题。

pip uninstall beautifulsoup4
pip install -Iv http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz