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
dedewei
V2EX  ›  Python

想爬豆瓣电影,用正则匹配出错,不清楚哪里不对,求搭救

  •  
  •   dedewei · 2015-03-18 18:19:03 +08:00 · 3525 次点击
    这是一个创建于 3574 天前的主题,其中的信息可能已经有所发展或是发生改变。
    页面: http://movie.douban.com/tag/%E6%97%A5%E5%89%A7?start=20&type=T

    我用的正则:<a class="nbg" href="(.+?)" title="(.+?)".+?<p class="pl">(.+?)</p>

    #####
    <a class="nbg" href="(.+?)" title="(.+?)" ###这里匹配电影名和url没问题
    .+? ###这里是想跳过中间,出错
    <p class="pl">(.+?)</p> ###匹配电影描述,独立出来也没问题

    目的是想一次过匹配电影名,url和电影描述,
    在匹配好电影名和url之后用.+?跳过中间匹配(电影描述),--- .+?这里跳过不行,该怎样处理?

    谢谢
    第 1 条附言  ·  2015-03-18 18:55:31 +08:00
    忘了添加 re.DOTALL 参数,问题已解决。谢谢
    19 条回复    2015-03-19 10:10:20 +08:00
    imn1
        1
    imn1  
       2015-03-18 18:25:01 +08:00   ❤️ 1
    有没有用参数把圆点包括换行符?
    wangfeng3769
        2
    wangfeng3769  
       2015-03-18 18:29:41 +08:00   ❤️ 1
    beautifullsoup 可以自己搞。
    dedewei
        3
    dedewei  
    OP
       2015-03-18 18:30:03 +08:00
    @imn1 .+? 这个没有跳过换行的吗? 用什么参数?能给个示例么.....谢谢。 也google去!
    dedewei
        4
    dedewei  
    OP
       2015-03-18 18:31:26 +08:00
    @wangfeng3769 就匹配几十个页面,正则会快点吧
    zhy0216
        5
    zhy0216  
       2015-03-18 18:32:35 +08:00
    不要用正则爬网页...
    dedewei
        6
    dedewei  
    OP
       2015-03-18 18:34:14 +08:00
    @imn1 用你给的提示换行搞掂了,把 .+? 换成 [\s\S]*
    非常感谢!!!
    zhy0216
        7
    zhy0216  
       2015-03-18 18:35:11 +08:00   ❤️ 1
    imn1
        8
    imn1  
       2015-03-18 18:35:12 +08:00   ❤️ 1
    建议善用排除正则,(?!(?:排除的字串)).*?
    另外,py中正则的贪婪和非贪婪和我预想的差距很大,特别是 findall 多组匹配的时候,注意改动一下观察结果
    dedewei
        9
    dedewei  
    OP
       2015-03-18 18:36:42 +08:00   ❤️ 1
    @zhy0216 匹配几十个页面,正则会快点?
    dedewei
        10
    dedewei  
    OP
       2015-03-18 18:37:37 +08:00
    @imn1 刚发现结果不对..哭.....
    dedewei
        11
    dedewei  
    OP
       2015-03-18 18:40:53 +08:00
    @imn1 还是没看懂,我再看看...
    dedewei
        12
    dedewei  
    OP
       2015-03-18 18:43:40 +08:00
    @zhy0216 读了几遍,没懂...
    dedewei
        13
    dedewei  
    OP
       2015-03-18 18:56:04 +08:00
    @imn1 原来是忘了添加 re.DOTALL 参数,问题已解决。谢谢
    imn1
        14
    imn1  
       2015-03-18 18:59:04 +08:00   ❤️ 1
    @dedewei
    parse 几十个页面正则没有明显优势,但是如果几万个页面,正则花费时间是 lxml 的2/3或更少,bs4就更不用说了,载入页面dom是很耗资源的

    我试过在一台老机器(带SSD)上单线程 parse 50+w 个 html,bs4 等了一小时没响应(死掉?),lxml+xpath 是2800+秒,正则是1600+秒,两个程序代码只有两行区别

    (?!(?:\<p class……)).*? 代替中间你要无视的那段字串,你去查查这种写法,自己做几个例子就明白了
    另外findall 做单句正则分组匹配真的很烦,有时用*和+结果相差甚远(有字符的情况),我经常要调试好几次才成功
    libo26
        15
    libo26  
       2015-03-18 19:35:07 +08:00
    表示用Beautifulsoup挺方便的
    frankzeng
        16
    frankzeng  
       2015-03-18 20:17:30 +08:00
    Beautifulsoup或xpath,为什么非要用虐心的正则表达式,写正则表达式可费脑了
    mutoulbj
        17
    mutoulbj  
       2015-03-18 20:51:41 +08:00
    pyquery大法好~
    dedewei
        18
    dedewei  
    OP
       2015-03-19 10:09:32 +08:00
    @imn1 多谢指导!
    dedewei
        19
    dedewei  
    OP
       2015-03-19 10:10:20 +08:00
    @frankzeng 小白,一切以运行成功为目的.....不过正则真的很痛苦.....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   952 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:13 · PVG 03:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.