xpath与正则表达式抽取网页信息的速度比较

2013-12-16 14:46:39 +08:00
 pc10201
以前我都是用正则表达式处理网页,对于那种非常不是经常改代码的网站,正则提取是非常好的

但对于经常改代码的网站,写一个好的正则表达式确实有点费事,用xpath就比较好,但写了脚本之后发现比以前慢一些,于是写了一个小程序测试一下速度

随便将一个百度搜索结果页另存为S:\baidu.htm,取title标签中的字符串

#coding=utf-8
import time
import re
import time
import lxml.html
f=open(r'S:\baidu.htm','r')
resp=f.read()
f.close()
t1=time.clock()
for x in xrange(1000):
title=re.search(r'<title>(.*?)</title>',resp).group(1)
print time.clock()-t1
content=resp.decode('utf-8')
dom=lxml.html.document_fromstring(content)
t2=time.clock()
for x in xrange(1000):
for item in dom.xpath('//title'):
title=item.text_content()
print time.clock()-t2
from lxml import etree
doc = etree.HTML(content)
t3=time.clock()
for x in xrange(1000):
for path in doc.xpath('//title'):
title=path.text
print time.clock()-t3
from pyquery import PyQuery
page = PyQuery(content,parser='html')
t4=time.clock()
for x in xrange(1000):
title=page('title').text()
print time.clock()-t4
结果如下
0.00576198176985
0.0840350097817
0.0778033702951
0.133525497136

确实正则很快,是其他方案的10倍以上,如果编译一下速度可能更快,pyquery最慢,中间是用lxml提取的,如果有不对的地方,希望大家指正.

来源
http://webrawler.blog.51cto.com/8343567/1341117
9204 次点击
所在节点    Python
3 条回复
binux
2013-12-16 14:53:26 +08:00
search啊,还是<title>,我还以为你是取搜索结果的title
那用findall替换search试试?<title>位置太靠前了
dorentus
2013-12-16 15:17:18 +08:00
Never parse HTML with regex: http://stackoverflow.com/a/1732454/90172

链接内容简言之:
1) HTML 不是正则语言,无法用正则表达式解析;
2) 如果 HTML 是已知的,问题还可以掌控;
3) 类似爬虫这种,你永远不会知道你会遇到怎样复杂的 HTML;
4) 合法的 HTML 都无法用正则解析,更不用说你还会碰到不合法但是浏览器可以支持的 HTML 了。
PrideChung
2013-12-16 15:29:33 +08:00
@dorentus 附议

撇开效果来谈性能根本无从谈起。xpath比较慢是因为它需要分析DOM,而不是简单的字符串比较,比正则的结果更加准确。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/93352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX