我已经为纯文本正则表达式序列构建了一个html。我在多达100个线程中使用它来清理html文件。我想获取给定html文件的所有可见文本信息。
self.content = re.sub(r'<!--(.|\n)*?-->', '', self.content)
self.content = re.sub(r'<script (.|\n)*?>(.|\n)*?</script>', '', self.content)
self.content = re.sub(r'<style (.|\n)*?>(.|\n)*?</style>', '', self.content)
self.content = re.sub(r'(<[^>]*?>+)', ' ', self.content)
我不是真正的正则表达式专家。也许我可以提高这个正则表达式的性能?
我不想使用beautifulsoap或django或html2text c ++发行版。他们在测试之后比我的正则表达式慢。我只需要一个空格的字符串,而不是树或链接等。
感谢您的帮助。我知道stackoverflow是一些非常聪明的人
答案 0 :(得分:4)
使用像BeautifulSoup或htmllib这样的工具,不要试图比世界其他地方更聪明。使用正则表达式解析HTML是您可以做的最糟糕的事情!在你的正则表达式失败的地方总会有一个Html文件。
答案 1 :(得分:0)
有一个共同的信条,即HTML和XML文本必须使用正则表达式工具进行处理。你必须考虑到这种治疗的风险是真实的,如果实施太多雄心勃勃的目标,就无法管理。 HTML和XML是太复杂的标记语言,需要用正则表达式进行分析。
但是我并不完全赞同这个共同的信条。在我看来,如果在可以合理地认为合法化这种用途的条件下使用正则表达式时,这种方法的清晰使用并不是一种荒谬的方法,因为风险似乎是最小的。
我相信正则表达式可以用于HTML或XML文本的有限和简单处理。我真的在stacoverflof.com上了解到用正则表达式解析HTML / XML是不切实际的。但是当一个解析(提取全部或部分标记树)没有隐含在治疗中时,为什么如此虔诚地拒绝正则表达式(我提到引用的链接)
在我看来,一个好的安全措施是限制使用正则表达式工具仅对来自常量来源的文本使用代码,而不是试图分析各种HTM或XML文本。
在发出这些警告之后,我敢向您提出以下对您的RE的改进:
re.sub('<!--.*?-->', '', self.content, flags=re.DOTALL)
和
re.sub('<(script|style) .*?\\1>', '', self.content, flags=re.DOTALL)