V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pc10201
V2EX  ›  Python

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

  •  
  •   pc10201 · 2013-12-16 14:46:39 +08:00 · 9264 次点击
    这是一个创建于 3973 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前我都是用正则表达式处理网页,对于那种非常不是经常改代码的网站,正则提取是非常好的

    但对于经常改代码的网站,写一个好的正则表达式确实有点费事,用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
    3 条回复    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       2013-12-16 14:53:26 +08:00
    search啊,还是<title>,我还以为你是取搜索结果的title
    那用findall替换search试试?<title>位置太靠前了
    dorentus
        2
    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
        3
    PrideChung  
       2013-12-16 15:29:33 +08:00
    @dorentus 附议

    撇开效果来谈性能根本无从谈起。xpath比较慢是因为它需要分析DOM,而不是简单的字符串比较,比正则的结果更加准确。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2479 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:29 · PVG 09:29 · LAX 18:29 · JFK 21:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.