【问题标题】:Can I remove script tags with BeautifulSoup?我可以使用 BeautifulSoup 删除脚本标签吗?
【发布时间】:2011-08-01 16:41:20
【问题描述】:

可以使用 BeautifulSoup 从 HTML 中删除 <script> 标记及其所有内容,还是必须使用正则表达式或其他方法?

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:
    >>> from bs4 import BeautifulSoup
    >>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'html.parser')
    >>> for s in soup.select('script'):
    >>>    s.extract()
    >>> soup
    baba
    

    【讨论】:

    • 链接附加标签的最佳方式是什么?现在,如果我一个接一个地重复命令,用 [s.extract() for s in soup('script')] 然后 [s.extract() for s in soup('iframe')] 等等,它就可以工作,但如果我像这样链接它们 [s.extract() for s in soup('iframe', 'script')] 则不会。
    • @Ali 你必须使用[s.extract() for s in soup(['iframe', 'script'])] 注意要使用多个标签,参数必须是一个列表
    • @FábioDiniz 我如何提取类似:'&lt;script class="blah"&gt;a&lt;/script&gt;baba&lt;script id="blahhhh"&gt;b&lt;/script&gt;' 的内容?是一样的吗?
    • soup 对象在此操作后变得无用,不再找到任何标签。
    • 这已经过时了,BeautifulSoup 似乎现在将字符串格式化为 html:&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;baba&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;
    【解决方案2】:

    为那些可能需要将来参考的人更新了答案: 正确答案是。 decompose()。 您可以使用不同的方式,但 decompose 可以正常工作。

    示例用法:

    soup = BeautifulSoup('<p>This is a slimy text and <i> I am slimer</i></p>')
    soup.i.decompose()
    print str(soup)
    #prints '<p>This is a slimy text and</p>'
    

    对于清除 &lt;script&gt;&lt;img&gt; 等碎屑非常有用。

    【讨论】:

    • decomposeextract 的区别在于后者返回被删除的东西,而前者只是销毁它。所以这是对这个问题的更准确的答案,但其他方法确实有效。
    • Decompose 不会删除脚本标签的内容,它只会删除标签。
    • 实际上,根据文档:“Tag.decompose() 从树中删除一个标签,然后完全销毁它及其内容:”crummy.com/software/BeautifulSoup/bs4/doc/#decompose
    • @Vangel 道歉,我想我忘了在我的评论中提到:我相信我是在回复 Roland Pihlakas 的评论。
    • 考虑到我们可能有多个i 标签并想要删除所有标签,我们可以(类似于上面的@FábioDiniz extract 示例)执行[s.decompose() for s in soup('i')]decompose() 本身只会删除第一个匹配项。
    【解决方案3】:

    如 (official documentation) 中所述,您可以使用 extract 方法删除与搜索匹配的所有子树。

    import BeautifulSoup
    a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
    [x.extract() for x in a.findAll('script')]
    

    【讨论】:

    • 有没有办法删除特定类的标签?我不想删除所有具有相同名称的标签,而只删除一个具有特定类的标签块。
    • 您所要做的就是选择要调用extract 的特定元素。 [x.extract() for x in a.select('span.className')]
    猜你喜欢
    • 2014-10-02
    • 2019-12-04
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多