如何用Python去除<script>和</script>之间的文本?

5 投票
9 回答
11191 浏览
提问于 2025-04-15 12:06

如何用Python删除之间的文本?

9 个回答

2

根据Pev和wr的回答,为什么不升级一个正则表达式,比如:

pattern = r"(?is)<script[^>]*>(.*?)</script>"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '', text)

(?is) - 这个部分是用来忽略大小写并允许文本中有换行符。这个版本还应该支持带属性的脚本标签。

补充说明:我还不能添加评论,所以我只是编辑我的回答。我完全同意下面的评论,正则表达式在这种任务上确实不太合适,而Beautiful Soup或lxml要好得多。不过,问题中给出的只是一个简单的例子,正则表达式对于这样简单的任务应该是足够的。对于简单的文本删除,使用Beautiful Soup可能会显得有些过于复杂(我不知道怎么表达我的意思,抱歉我的英语)。

顺便说一下,我犯了个错误,代码应该是这样的:

pattern = r"(?is)(<script[^>]*>)(.*?)(</script>)"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '\1\3', text)
6

你是不是想防止跨站脚本攻击(XSS)?单单去掉<script>标签并不能解决所有可能的攻击!这里有一个很棒的列表,列出了你可能会面临的多种漏洞(其中一些非常有创意),你可以在http://ha.ckers.org/xss.html找到。看完这个页面后,你应该明白,单靠用正则表达式去掉<script>标签并不够安全。Python的库lxml有一个功能,可以有效地清理你的HTML,使其安全可显示。

如果你确定只想去掉<script>标签,下面的lxml代码应该可以用:

from lxml.html import parse

root = parse(filename_or_url).getroot()
for element in root.iter("script"):
    element.drop_tree()

注意:我对所有使用正则表达式的解决方案进行了反对。你可以在这里看到为什么不应该用正则表达式解析HTML:为什么不使用正则表达式解析HTML?

注意2:还有另一个SO问题展示了用正则表达式解析HTML是多么困难:你能提供一些例子说明为什么用正则表达式解析XML和HTML很难吗?

27

你可以使用BeautifulSoup来实现这个功能(还有其他方法也可以):

soup = BeautifulSoup(source.lower())
to_extract = soup.findAll('script')
for item in to_extract:
    item.extract()

这个方法实际上是把HTML中的节点给删除掉了。如果你想保留空的<script></script>标签,那你就得处理一下item的属性,而不是仅仅从“汤”中提取它。

撰写回答