【问题标题】:Beautiful Soup Not able to get_text after using extract()Beautiful Soup 使用 extract() 后无法获取文本
【发布时间】:2015-07-05 19:34:46
【问题描述】:

我正在研究网络抓取,我只想要来自任何网站的文本,所以我使用Beautiful Soup。最初我发现get_text() 方法也返回JavaScript 代码,所以为了避免我遇到我应该使用extract() 方法但现在我有一个奇怪的问题,在提取scriptstyle 标记@987654327 之后@ 无法识别它的主体,即使它存在于新的 `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。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    问题:使用这个 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.- 在 extract() 调用之后再次解析汤。

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

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

    BeautifulSoup(raw, 'html5lib')
    

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

    注意:您可能必须安装此解析器。就这样吧:

    pip install html5lib
    

    【讨论】:

    • 昨天刚遇到这个问题,在这里寻找答案
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我不是@maq,但我看到的行为完全相同。什么是原始数据?似乎不是BeautifulSoup 的方法,也没有出现在dir(soup) 中。
    • 其实dir并没有显示出来,而是一个属性。对我来说,rawDataNone。但是 get_text() 似乎仍然会输出我提取的脚本标签中的废话。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2021-01-23
      • 2015-07-17
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多