我正在使用Beautifulsoup解析大型HTMl文件,范围在3到10MB之间.不幸的是,99%的数据是我要解析的内容.该文件实际上包含一个小标题,一些js脚本,然后是1,000到10,000个项目.每个项目由以下表格行组成:
[content1][content2][content3][content4][content5][content6][content7][content8][content9][content10][content11][content12][content13] [content16]
请注意,每个[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功率.
解决方法:
假设您首先将整个文件读入内存,那么您无法做其他事情.如果HTML在很多地方被破坏,那么解析器必须执行更多工作来尝试猜测正确的结构.
在Python中解析XML / HTML时,我的经验是lxml是最快且最有效的内存(与xml.minidom或BeautifulSoup相比).
但是,我在不到15秒的时间内解析了大于10MB的简单XML文件,因此它让我相信你可能有非常讨厌/严重嵌套的HTML,这会扼杀解析器.无论是那个还是我的硬件都是疯狂的(i7 2700k和SSD).
标签:python,parsing,lxml,beautifulsoup,performance
来源: https://codeday.me/bug/20190609/1205543.html