Python html2text 正则表达式性能

0 投票
2 回答
787 浏览
提问于 2025-04-16 13:51

我写了一个把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)

我其实对正则表达式不是很在行。也许我可以提升这个正则表达式的性能?

我不想使用BeautifulSoup、Django或者html2text的C++版本,因为经过测试它们比我的正则表达式要慢。我只需要一个用空格分开的字符串,不需要树形结构或者链接等。

谢谢大家的帮助。我知道在StackOverflow上有一些非常聪明的人。

2 个回答

0

有一个普遍的观点认为,HTML和XML的文本绝对不能用正则表达式(regex)来处理。大家都知道,如果用正则表达式去处理这些文本,风险是非常大的,而且如果目标太过复杂,这种风险几乎是无法控制的。因为HTML和XML都是比较复杂的标记语言,用正则表达式来分析它们并不合适。

不过,我并不完全认同这个观点。在我看来,如果使用得当,正则表达式并不是一个完全荒谬的方法。只要在合理的情况下使用正则表达式,风险就会降到最低。

  • 我认为,正则表达式可以用来对HTML或XML文本进行一些有限且简单的处理。我在stacoverflof.com上了解到,用正则表达式解析HTML/XML是不可行的。但是,如果处理的内容并不涉及到解析(也就是提取整个或部分的标记树),那么为什么要如此坚定地拒绝使用正则表达式呢?(我指的是之前提到的链接)

  • 在我看来,一个好的安全措施是限制正则表达式的使用,只在来自固定来源的文本上使用,而不是尝试去分析各种不同的HTML或XML文本。

在给出这些警告后,我敢于向你们提出以下对正则表达式的改进建议:

re.sub('<!--.*?-->', '', self.content, flags=re.DOTALL)

re.sub('<(script|style) .*?\\1>', '', self.content, flags=re.DOTALL)
4

使用像BeautifulSoup或htmllib这样的工具,不要试图比别人聪明。用正则表达式来解析HTML是最糟糕的选择!总会有一个HTML文件会让你的正则表达式失效。

撰写回答