Mat*_*ern 1 python regex lxml web-crawler html-parsing
我正在尝试构建一个快速的Web爬虫,因此,我需要一种有效的方法来查找页面上的所有链接.快速XML/HTML解析器(如lxml)和使用正则表达式匹配之间的性能比较是什么?
这里的问题不是关于正则表达式与lxml.正则表达式不是一个解决方案.你如何限制链接来自哪里的元素?一个更现实世界的例子是格式错误的HTML.您将如何href从此链接中提取属性的内容?
<A href = /text" data-href='foo>' >Test</a>
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
测试HTML:
html = requests.get('http://stackoverflow.com/questions?pagesize=50').text
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
相比之下,以下是Chrome选择的链接数量:
> document.querySelectorAll('a[href]').length
413
Run Code Online (Sandbox Code Playgroud)
此外,仅仅为了记录,Scrapy是最好的网络抓取框架之一,它使用lxml来解析HTML.
| 归档时间: |
|
| 查看次数: |
1031 次 |
| 最近记录: |