Beautiful Soup 在使用 extract() 后无法 get_text

Beautiful Soup Not able to get_text after using extract()

我正在从事网络抓取工作,我只需要来自任何网站的文本,所以我正在使用 Beautiful Soup。最初我发现 get_text() 方法也返回 JavaScript 代码,所以为了避免我遇到我应该使用 extract() 方法但现在我有一个奇怪的问题,在提取 scriptstyle 标签 Beautiful Soup 无法识别它的主体,即使它出现在新的 `html.

让我先澄清一下我在做这个

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 包括 body 标签并且还有没有 scriptstyle 标签 :( 现在我很困惑为什么它会发生,如果 body 存在而不是为什么它说 None 请帮忙谢谢

并且我正在使用 Python 3 和 bs4,并且 rawData 是 html 从网站中提取的。

你能包括rawData的内容吗? 如果您的原始数据类似于:

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

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

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

问题: 使用这个 html 例子:

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

在提取 style 标签并调用 get_text() 之后,returns 只有它应该删除的文本。这是由于使用 extract() 后 html 中的双换行符。在 .extract() 之前和之后调用 soup.contents,您将看到此问题。

提取之前():

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

提取后():

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

您可以看到 html 和 span 之间的双换行符。由于某些未知原因,此问题会中断 get_text()。要验证这一点,请删除示例中的换行符,它将正常工作。

解法:

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

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

2.- 使用不同的解析器。

BeautifulSoup(raw, 'html5lib')

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

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

pip install html5lib

这似乎是最新的 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