gpt4 book ai didi

python - 快速查找链接 : regex vs. lxml

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:32 25 4
gpt4 key购买 nike

我正在尝试构建一个快速的网络爬虫,因此,我需要一种有效的方法来定位页面上的所有链接。像 lxml 这样的快速 XML/HTML 解析器与使用正则表达式匹配的性能比较如何?

最佳答案

这里的问题不在于正则表达式与 lxml。正则表达式不是解决方案。您将如何限制链接来自的元素?一个更真实的例子是格式错误的 HTML。您将如何从此链接中提取 href 属性的内容?

<A href = /text" data-href='foo>' >Test</a>

lxml 解析得很好,就像 Chrome 一样,但祝你好运,让正则表达式工作。如果您对实际速度差异感到好奇,这里是我进行的快速测试。

设置:

import re
import lxml.html

def test_lxml(html):
root = lxml.html.fromstring(html)
#root.make_links_absolute('http://stackoverflow.com/')

for href in root.xpath('//a/@href'):
yield href

LINK_REGEX = re.compile(r'href="(.*?)"')

def test_regex(html):
for href in LINK_REGEX.finditer(html):
yield href.group(1)

测试 HTML:

html = requests.get('http://stackoverflow.com/questions?pagesize=50').text

结果:

In [22]: %timeit list(test_lxml(html))
100 loops, best of 3: 9.05 ms per loop

In [23]: %timeit list(test_regex(html))
1000 loops, best of 3: 582 us per loop

In [24]: len(list(test_lxml(html)))
Out[24]: 412

In [25]: len(list(test_regex(html)))
Out[25]: 416

为了比较,下面是 Chrome 挑选出的链接数量:

> document.querySelectorAll('a[href]').length
413

此外,仅作记录,Scrapy是目前最好的网络抓取框架之一,它使用 lxml 来解析 HTML。

关于python - 快速查找链接 : regex vs. lxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16929149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com