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


90

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

Answers:


160
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> for s in soup.select('script'):
>>>    s.extract()
>>> soup
baba

链接要删除的其他标签的最佳方法是什么?现在,如果我一个接一个地重复此命令,则可以使用[s.extract()表示汤('script')中的s,然后[s.extract()表示汤中的s('iframe')],依此类推,但如果我像这样[s.extract()表示汤中的s('iframe','script')],则不会。
伊拉2012年

8
@Ali你将不得不使用[s.extract() for s in soup(['iframe', 'script'])]需要注意的是使用多个标签,必须将参数列表
法比奥·迪尼兹

@FábioDiniz我将如何提取类似的内容'<script class="blah">a</script>baba<script id="blahhhh">b</script>'?一样吗
user2883071 2015年

2
此操作后,汤对象变得无用,不再找到标签。
imrek 16-3-12

1
这已过时,BeautifulSoup现在似乎将字符串格式化为html:<html><head></head><body><p>baba</p></body></html>
CloC

37

为可能需要将来参考的人员更新了答案:正确的答案是。 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>'

消除诸如“ script”,“ img”之类的碎屑等非常有用。


8
decompose和之间的区别在于,extract后者返回被移除的东西,而前者则将其销毁。因此,这是对该问题的更精确答案,但是其他方法也可以。
迈克

1
分解不会删除脚本标签的内容,而只会删除标签。
罗兰·皮拉卡斯

我同意你的评论。这就是为什么我根据remove内容OP回答正确的原因。通常用于清除不需要的标签和格式的HTML。
Abhishek Dujari

7
实际上,根据文档:“ Tag.decompose()从树中删除了一个标签,然后完全销毁了它及其内容:” crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel歉意,我想我忘了在评论中添加提及:我相信我是在回应Roland Pihlakas的评论。
jarcobi889

22

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

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.