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

解析网页到底用不用正则解析?

  •  1
     
  •   pc10201 · 2014-07-23 17:57:47 +08:00 · 4638 次点击
    这是一个创建于 3805 天前的主题,其中的信息可能已经有所发展或是发生改变。
    观点1.
    不用
    来源
    http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

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

    观点2
    推荐使用
    来源
    http://www.cnblogs.com/-ajian/p/3606306.html

    获取链接建议用正则表达式,解析整个HTML非常耗时,哪怕使用最快的lxml,依然会比Python里的正则表达式慢四倍以上。而且还有大量的不规范HTML,处理起来很麻烦。正则的问题是会匹配到script里的网址,可以简单总结一下遇到的不正常URL,过滤一下即可。

    我个人是简单网页用正则,复杂网页正则搞不定的用xpath
    不知道大家如何处理的?
    15 条回复    2014-07-24 13:26:57 +08:00
    est
        1
    est  
       2014-07-23 18:05:23 +08:00 via Android
    看需求。糙快猛不怕死啥都敢用
    lei286394973
        2
    lei286394973  
       2014-07-23 18:06:49 +08:00
    如果是python解析的话 推荐使用 pyquery! 可以使用jquery的语法获取界面元素的。。简直神器!
    imn1
        3
    imn1  
       2014-07-23 18:09:25 +08:00
    我看数量,量多一定不用DOM,只用正则,DOM消耗内存和时间都多
    量少哪个方便用哪个
    其实正则基本能搞定的,只是有时候没有id很难定位,要写得很复杂,还要测试,不如xpath写得简单,所以就用xpath
    akfish
        4
    akfish  
       2014-07-23 18:13:53 +08:00
    lz标题有误导,原题目根本就没提“解析(parse)”二字。
    所以被接受答案其实也是审题不明确,nb哄哄的说了一大堆正确的废话。
    题主又不是要写一个通用的HTML parser,不过是要完成一项特定任务而已。
    qq529633582
        5
    qq529633582  
       2014-07-23 18:16:19 +08:00
    同上,用正则不是要解析HTML,只是在知道HTML大致结构的时候从网页中提取指定内容
    akfish
        6
    akfish  
       2014-07-23 18:22:13 +08:00
    如果真的说解析(parse),懂编译原理,写过编译器的人都知道是怎么回事的。
    正则式只会出现在tokenize一步,并且由lexer generator生成FSM,并不会调用通用的正则式解析库。
    iyaozhen
        7
    iyaozhen  
       2014-07-23 18:55:57 +08:00
    不知道需求是什么,抓取网页分析出可用数据的话我一般用正则+dom解析器。
    先用正则匹配出目标信息所在的DIV或Table,然后在用dom解析器。这样dom解析器也不用消耗很多的内存和时间。
    当然,直接用正则更快,但更麻烦,容易出错。特别是匹配表格信息,用dom解析器即快速又准确。
    dorentus
        8
    dorentus  
       2014-07-23 18:59:55 +08:00
    @akfish 我倒是觉得答案没啥问题。
    题主问的是怎么用 regex 匹配一些 HTML,但是由于 HTML 不是正则语言,所以*单用*正则表达式是无法匹配的。Tokenization 用到正则则是另外一回事了。
    lincanbin
        9
    lincanbin  
       2014-07-23 19:23:18 +08:00
    匹配数据用正则
    解析html用解析DOM树的方法
    binux
        10
    binux  
       2014-07-23 19:48:37 +08:00   ❤️ 1
    解析速度总是快于抓取速度
    viowan
        11
    viowan  
       2014-07-23 20:07:08 +08:00
    我觉得还是需要看需求吧,如果有一定的容错范围,并且解析的网页代码基本固定的用正则感觉没啥问题。如果对相应数据精确度要求高,解析的网页代码不固定,并且有些可能要通过执行js或者什么之类的才能获得,那还是不建议用JS。总之还是看需求。
    azuginnen
        12
    azuginnen  
       2014-07-23 20:43:38 +08:00
    @binux 对啊,我感觉这说的挺有道理,爬虫快了网站还要封你呢
    tabris17
        13
    tabris17  
       2014-07-23 22:57:41 +08:00
    要看实际问题,只是做个爬虫抓取文本,正则就够了
    zhanglp888
        14
    zhanglp888  
       2014-07-24 12:45:10 +08:00
    我做过一段时间的抓取html的工作,我是这样做的:
    1.读取全部html后,用tidy这个工具,整理html(可转成utf-8)。
    2.根据想要的东西读取内容,用的是xpath,用正则很难
    xpath方面,用过phpquery这个工具
    java方面: 看这个 -》 http://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
    php方面:看这个 -》 http://www.ibm.com/developerworks/cn/xml/x-datamineparsephp/

    中间的问题有很多,很难完美解决
    dingyaguang117
        15
    dingyaguang117  
       2014-07-24 13:26:57 +08:00
    程序员要节省时间,简单粗暴第一准则
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:00 · PVG 06:00 · LAX 14:00 · JFK 17:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.