如何使用BeautifulSoup加速解析10MB HTML文件

时间:2015-03-20 01:11:40

标签: python performance parsing beautifulsoup lxml

我正在使用Beautifulsoup解析大型HTMl文件,范围在3到10MB之间。不幸的是,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>

注意每个[content]占位符都是我需要解析的相关数据。

我尝试了各种常见的优化,例如a)使用不同的解析器,b)使用SoupStrainer,c)定义编码

b)和c)当我记录所需的时间时实际上没有效果。不同的解析器具有重大影响。当我在1.5k项目列表(相对较小的列表)上运行下面的脚本时,我得到以下解析时间(我在2012年Mac Book Air上运行实验):

#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功率。

3 个答案:

答案 0 :(得分:2)

假设您先将整个文件读入内存,那么您无法做其他事情。如果HTML在很多地方被破坏,那么解析器必须执行更多工作来尝试猜测正确的结构。

在Python中解析XML / HTML时,我的经验是lxml是最快且最有效的内存(与xml.minidom或BeautifulSoup相比)。

但是,我在不到15秒的时间内解析了大于10MB的简单XML文件,所以它让我相信你可能真的讨厌/重度嵌套的HTML,这会扼杀解析器。无论是那个还是我的硬件都是疯狂的(i7 2700k和SSD)。

答案 1 :(得分:2)

lxml似乎是Python中最好的解决方案。

enter image description here

我们在构建时对所有解析器/平台进行基准测试:serpapi.com https://medium.com/@vikoky/fastest-html-parser-available-now-f677a68b81dd

答案 2 :(得分:1)

您是否尝试过使用lxml iterparse并在每次迭代时删除节点。这是一个excellent article,讨论如何解析大文件。最后请参阅解决方案。