有没有更有效的方法来解析 lxml 中的信息

Is there a more efficient way to parse information in lxml

提问人:DankCoder 提问时间:6/9/2020 更新时间:6/9/2020 访问量:73

问:

最近,我开始使用 BeautifulSoup 制作一个 YouTube 视频信息提取器,并对其进行了基准测试,发现它非常慢(每个视频大约 1-3 秒),并且当它必须查询大量 url 列表时效率低下

在查看了一个名为 lxml 的解析器(据称速度提高了 30 倍)的一些基准测试后,我决定将项目的 HTML 解析器更改为 lxml,令人惊讶的是,性能确实提高了 30%

性能提高是一个好兆头,但对于大型数据集来说仍然不够,我怀疑这与我的解析方法有关

无论如何,这是我目前从 YouTube 视频中获取各种信息的方法

#advadata is html document loaded in lxml

self.views=advdata.xpath("//div[contains(@class,'watch-view-count')]")[0].text
self.published_on=advdata.xpath("//strong[contains(@class,'watch-time-text')]")[0].text 
self.channel="https://youtube.com"+advdata.xpath("//div[contains(@class,'yt-user-info')]/a/@href")[0]
self.creator=advdata.xpath("//div[contains(@class,'yt-user-info')]/a")[0].text
self.likes=advdata.xpath("//button[contains(@class,'like-button-renderer-like-button')]/span")[0].text#like-button-renderer-like-button
self.dislikes=advdata.xpath("//button[contains(@class,'like-button-renderer-dislike-button')]/span")[0].text#like-button-renderer-dislike-button
self.description=advdata.xpath("//p[contains(@id,'eow-description')]")[0].text#eow-description

现在我的问题是,我是否以正确的方式解析信息,如果不是,是否有更快的方法来解析数据?

python 解析 beautifulsoup html 解析 lxml

评论

1赞 Maurice Meyer 6/10/2020
您可以尝试不全局搜索>扩展 xpath 以尽可能接近您需要的标记。有一个基准测试不确定它是否可靠,但列出了其他 XML 库,声称比 lxml/libxml2 更快。其中一些可用于 Python ...但我自己从来没有对它们进行过基准测试。
0赞 DankCoder 6/10/2020
感谢您的基准测试,我想您是对的,因为看起来全局定位不同的元素确实会占用大量 CPU 使用率,从而增加整体时间。我可能需要稍微改变我的方法以获得我需要的性能。再次感谢您的解决方案
0赞 Daniel Haley 6/11/2020
您确定这些 xpath 是问题所在吗?您是否对整个程序进行了分析,以了解瓶颈是什么?(PyCharm 专业版有很好的分析器和试用版。jetbrains.com/help/pycharm/profiler.html)
1赞 DankCoder 6/11/2020
@Daniel Haley 我重新做了基准测试,我意识到我之前进行基准测试的方式是错误的,实际上需要 15 毫秒来解析和定位我想要提取的所有信息。我所做的基准测试意外地包括完成请求所需的时间,大约是 900 毫秒。难怪它花了 2-3 秒才完成

答: 暂无答案