首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加快使用BeautifulSoup解析10 up文件的速度

如何加快使用BeautifulSoup解析10 up文件的速度
EN

Stack Overflow用户
提问于 2015-03-20 01:11:39
回答 3查看 2.7K关注 0票数 4

我正在使用范围在3到10‘m之间的Beautifulsoup解析大型HTMl文件。不幸的是,99%的数据是我想要解析的内容。该文件实际上包含一个小的头、几个js脚本,然后包含1,000到10,000个条目。每个项目由以下表行组成:

代码语言:javascript
复制
<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上运行实验):

代码语言:javascript
复制
#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的功率。

EN

回答 3

Stack Overflow用户

发布于 2015-03-20 05:06:38

假设您先将整个文件读入内存中,那么您就没有什么别的办法了。如果HTML在相当多的地方被破坏,那么解析器必须执行更多的工作来尝试和猜测正确的结构。

在用Python解析XML/HTML时,我的经验是,lxml是速度最快、内存效率最高的(与xml.minidom或BeautifulSoup相比)。

但是,我在不到15秒的时间内解析了大于10 me的简单XML文件,因此我相信您可能有非常讨厌的/重嵌套的HTML,它正在扼杀解析器。或者是我的硬件太棒了(i7 2700k和SSD)。

票数 2
EN

Stack Overflow用户

发布于 2018-12-09 22:59:18

lxml看起来是Python中最好的解决方案。

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-20 02:09:29

您是否尝试过在每次迭代中使用lxml iterparse并删除节点。下面是一个优秀文章,它讨论如何解析大型文件。看最后的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29157779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档