我可以使用BeautifulSoup删除脚本标签吗?

Sam*_*Sam 84 html python beautifulsoup

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

Fáb*_*niz 144

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> [s.extract() for s in soup('script')]
>>> soup
baba
Run Code Online (Sandbox Code Playgroud)

  • @Ali你必须在汤中使用`[s.extract()for s(['iframe','script'])]`注意,要使用多个标签,参数必须是一个列表 (6认同)
  • 在此操作之后,汤对象变得无用,不再找到标签. (2认同)
  • 这已经过时了,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认同)

Abh*_*ari 26

更新了可能需要将来参考的人的答案:正确的答案是. 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>'
Run Code Online (Sandbox Code Playgroud)

摆脱像'脚本','img'这样的碎片非常有用.

  • 实际上,根据文档:"Tag.decompose()从树中删除一个标签,然后完全销毁它及其内容:"https://www.crummy.com/software/BeautifulSoup/bs4/doc/#decompose (5认同)
  • `decompose`和`extract`之间的区别在于后者返回被删除的东西,而前者只是将其摧毁.所以这是对问题的更精确答案,但其他方法确实有效. (4认同)
  • 考虑到我们可能有多个“i”标签并希望删除所有它们,我们可以(类似于上面的@FábioDiniz“extract”示例)执行“[s.decompose() for s in soup('i')” ]`。`decompose()` 本身仅删除第一次出现的情况。 (4认同)
  • 分解不会删除脚本标签的内容,它只会删除标签。 (2认同)
  • @Vangel 道歉,我想我忘了在评论中提及:我相信我是在用该评论回应 Roland Pihlakas。 (2认同)

San*_*dri 21

如(官方文档)中所述,您可以使用该extract方法删除与搜索匹配的所有子树.

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