使用Python中的正则表达式如何删除HTML注释

8
我想从HTML文本中删除HTML注释。
<h1>heading</h1> <!-- comment-with-hyphen --> some text <-- con --> more text <hello></hello> more text

应该有以下结果:
<h1>heading</h1> some text <-- con --> more text <hello></hello> more text

在已知的有限HTML集合上使用正则表达式可能是适当的。然而,你应该意识到有无数情况会导致它失效,因此通常不建议使用。 - grc
相关链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - jonrsharpe
为什么这个问题会被踩?如果你正在处理“已知的HTML集合”,那么这是一个合理的问题。 - Rushabh Mehta
考虑使用类似Beautiful Soup这样的HTML专用库,就像这个其他问题的解决方案所建议的那样: https://dev59.com/R2Ag5IYBdhLWcg3ws8ro - hectorcanto
6个回答

9

你不应该忽略回车符。

re.sub("(<!--.*?-->)", "", s, flags=re.DOTALL)

为什么我们也不应该去除回车符呢? - Ethan
huazhihao的答案符合在评论中有回车符的评论。另一个答案缺少flags=re.MULTILINE。 - Greg Lindahl
4
应该使用re.DOTALL而不是re.MULTILINE,因为re.DOTALL可以匹配.上的\n - fjsj

4
html = re.sub(r"<!--(.|\s|\n)*?-->", "", html)

re.sub主要是查找匹配实例并用第二个参数替换。对于本例,<!--(.|\s|\n)*?--> 匹配以 <!-- 开始、以 --> 结尾的所有内容。点和问号表示任何字符,而 \s 和 \n 添加了多行注释的情况。


1
欢迎来到 [so]!如果提问者能够自己理解你的代码,他可能就不会提问了。请解释一下它的作用,这样对于那些需要查找正则表达式的人来说才有价值。 - jpaugh

3

最终想出了这个选项:

re.sub("(<!--.*?-->)", "", t)

添加?使搜索变为非贪婪模式,不会合并多个注释标签。


2
不要使用正则表达式。相反,使用XML解析器,标准库中的解析器已经足够了。
from xml.etree import ElementTree as ET
html = ET.parse("comments.html")
ET.dump(html) # Dumps to stdout
ET.write("no-comments.html", method="html") # Write to a file

1
虽然这是一个好建议,但与这种正则表达式相比,XML解析器的性能要慢得多,慢得多,慢得多。 - Greg Lindahl

1
re.sub("(?s)<!--.+?-->", "", s)

or

re.sub("<!--.+?-->", "", s, flags=re.DOTALL)

0
你可以尝试使用这个正则表达式:<![^<]*>

你的正则表达式匹配了太多 -- 请注意问题中有一个例子 "<-- con -->",它不是HTML注释。 - Greg Lindahl
@GregLindahl 这个正则表达式没有匹配 "<-- con -->",并且返回了OP期望的结果。 - dragon2fly
2
这将无法匹配包含HTML标签的注释,例如<!-- <br/> -->。 - k-den

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接