一个快速的Python HTML解析器

15
我写了一个Python脚本来处理大量下载的网页HTML(120K页)。 我需要解析它们并从中提取一些信息。 我尝试过使用BeautifulSoup,它很容易和直观,但是它运行起来非常慢。由于这是某些将在Amazon上在一台弱小的机器上定期运行的内容,速度很重要。 在Python中是否有比BeautifulSoup更快的HTML/XML解析器?或者我必须采用正则表达式解析...

5
不要让小马靠近... - user554546
4
我对在Python中解析HTML没有经验,但是这里有一些基准测试结果,你可能会觉得有用。 - user554546
8
正则表达式和HTML结合使用会导致失败。 - user177800
2
@JackManey - 哇,这次之后我肯定不会再使用正则表达式解析HTML了... - WeaselFox
我们能看到使用BeautifulSoup的代码吗?也许您无意中使它做了太多的工作? - Karl Knechtel
显示剩余4条评论
3个回答

17

2
谢谢,基准测试确实显示lxml更快! - WeaselFox
1
安装方法:pip install lxml - Flimm

5

流式解析器(或SAX-style解析器)可能比DOM-style解析器更快。代码一次只传递一个元素,因为它们在文档中出现,尽管你必须自己推断(并跟踪)它们的关系,但你只需要维护足够定位所需数据的状态。作为奖励,一旦你找到感兴趣的内容,你可以提前终止解析,节省处理余下文档所需的时间。

相比之下,DOM-style解析器需要构建完整的可导航对象模型,在这个过程中需要时间(和内存)。DOM-style解析器通常是基于流式解析器构建的,因此它们将比使用的流式解析器慢。

Python有一个名为html.parser的HTML流式解析器。根据你想要提取的数据有多难识别,实际上编写一个流式解析器进行网络爬虫可能会很复杂,因为API与你习惯思考文档的方式不同。因此,即使运行时较慢,选择易于使用的解析器也可能值得,因为简单的工作代码通常比带有错误的复杂代码更好。

然而,用C语言编写的解析器(如lxml)无论采用何种方法,都能比使用纯Python编写的解析器更快速地处理数据,这也许是您获得所需速度的一种方式。实际上,现在的BeautifulSoup已将lxml作为其默认解析器。


0

尝试一下:ElementTree可能会更快,但我不确定。

xml.etree.ElementTree import ElementTree

我也想建议这个...不过,我没有任何数据来支持它相对于BeautifulSoup的性能比率。 - inspectorG4dget
这里提供一个基准测试。https://medium.com/@vikoky/fastest-html-parser-available-now-f677a68b81dd - jvmvik

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