我正在使用范围在3到10‘m之间的Beautifulsoup解析大型HTMl文件。不幸的是,99%的数据是我想要解析的内容。该文件实际上包含一个小的头、几个js脚本,然后包含1,000到10,000个条目。每个项目由以下表行组成:
<tr class="New" id="content_id">
<td class="item" align="center">
</td><td align="center">
<a onclick="somecode"><img src="/images/sample.gif" alt="alttext" class="image"></a>
</td><td style="astyle">[content1]</td><td>[content2]</td><td>[content3]</td><td>[content4]</td><td>[content5]</td><td style="bstyle">[content6]</td><td>[content7]</td><td>[content8]</td><td>[content9]</td><td>[content10]</td><td>[content11]</td><td></td><td>[content12]</td><td>[content13]</td><td>
<a href="somejs">[content14]</a>
</td><td>
<a href="somejs">[content15]</a>
</td><td>[content16]</td><td>
<a title="" href="somejs">[content16]</a>
</td><td>
<a title="" href="somejs">[content17]</a>
</td>
</tr>注意,每个内容占位符都是我需要解析的相关数据。
我尝试过多种常见的优化,例如:( a)使用不同的解析器,( b)使用SoupStrainer,( c)定义编码
( b)和c)当我记录所需时间时,实际上没有任何效果。不同的解析器有很大的影响。当我在1.5k项列表(相当小的列表)上运行下面的脚本时,我得到了以下解析时间(我正在2012年Mac上运行实验):
#1653 items parsed in 15.5 seconds with lxml
#xml takes 27 sec
#html5lib takes 69 sec
#html.parser takes 24 sec
current = datetime.datetime.utcnow()
strainer = SoupStrainer('table', attrs={'id':'contenttable'})
soup = BeautifulSoup(html,'lxml',parse_only=strainer,from_encoding="UTF-8")
print datetime.datetime.utcnow() - current问题:除了到目前为止我使用的内容之外,还有什么可以用来大大缩短解析时间的调整吗?
到目前为止,我只能考虑增加CPU的功率。
发布于 2015-03-20 05:06:38
假设您先将整个文件读入内存中,那么您就没有什么别的办法了。如果HTML在相当多的地方被破坏,那么解析器必须执行更多的工作来尝试和猜测正确的结构。
在用Python解析XML/HTML时,我的经验是,lxml是速度最快、内存效率最高的(与xml.minidom或BeautifulSoup相比)。
但是,我在不到15秒的时间内解析了大于10 me的简单XML文件,因此我相信您可能有非常讨厌的/重嵌套的HTML,它正在扼杀解析器。或者是我的硬件太棒了(i7 2700k和SSD)。
发布于 2018-12-09 22:59:18
lxml看起来是Python中最好的解决方案。

我们在构建: serpapi.com https://medium.com/@vikoky/fastest-html-parser-available-now-f677a68b81dd时对所有解析器/平台进行基准测试
发布于 2015-03-20 02:09:29
您是否尝试过在每次迭代中使用lxml iterparse并删除节点。下面是一个优秀文章,它讨论如何解析大型文件。看最后的解决方案。
https://stackoverflow.com/questions/29157779
复制相似问题