HeyDMCreally

Python 写爬虫,正则式匹配总是有问题求解答

  •  
  •   HeyDMCreally · Dec 5, 2015 · 2985 views
    This topic created in 3985 days ago, the information mentioned may be changed or developed.

    pattern = re.compile('<div.?author.?title="(.*?)"',re.S)

    pattern = re.compile('<div.*?class="content">(.*?)</div>',re.S)

    pattern = re.compile('<i.*?class="number">(.*?)</i>',re.S)

    以上注释的正常出结果
    pattern = re.compile('<div.*?author.*?title="(.*?)".*?<div.*?class=".*?<div.*?class="content">(.?)</div>.?<i.*?class="number">(.*?)</i>',re.S)
    三个合起来的不出结果,不知是什么问题
    后面试着改了几次,结果有几次输出八进制
    这是写的爬糗百的。。,求指点

    15 replies  •  2015-12-06 01:36:01 +08:00
    HeyDMCreally
    HeyDMCreally
    OP
    Dec 5, 2015
    2
    @halfcrazy 谢谢 不过问题纠结了很久 想知道是哪里表达错了
    halfcrazy
    halfcrazy
    Dec 5, 2015
    3
    @halfcrazy 方便把要匹配的字串贴出来么
    iEverX
    iEverX
    Dec 5, 2015
    5
    @HeyDMCreally 发一个你要匹配的字符串,就是你程序里面的 content
    lecher
    lecher
    Dec 5, 2015
    6
    我也犯过类似的错误,正则尽量不要用(.*)这样会导致最长匹配,结果就是本意是匹配一串列表的最终匹配出一大段 html 代码。

    如果用正则,最好拆分一下,比如要匹配<div class="style1">一大段列表<li></li></div>就先用正则把这个 div 的内容取出来,再对里面的内容进行正则处理。
    iyaozhen
    iyaozhen
    Dec 5, 2015
    7
    跨行匹配的问题?

    .*? -> [/s/S]*?
    bdbai
    bdbai
    Dec 5, 2015 via iPhone
    9
    @lecher .*? 大法好
    Victor215
    Victor215
    Dec 6, 2015 via Android
    10
    这东西分开还能看明白 合起来完全不知道是什么鬼,就算你改好了 放一段时间回来看我相信你肯定也是看不懂的 能简单的分开的就不要合并起来 我觉得能多匹配几次匹配出来就行
    popok
    popok
    Dec 6, 2015
    11
    @HeyDMCreally 根据你 8 楼的内容,写的。
    title="(.*)">\s<h2>.*</h2>\s</a>\s</div>\s+<div class="content">\s+(.*)\s+<!--\d+-->\s+</div>\s+<div class="stats">\s+<span class="stats-vote"><i class="number">(\d+)</i
    popok
    popok
    Dec 6, 2015
    12
    能分开匹配还是分开比较好点
    我的方法是,先 content 写入测试工具,然后把需要匹配那段复制出来,写到正则那栏,然后把其中变化的部分都用正则表示,然后换行都改成\s+,然后就能用了。

    当然这种都是傻瓜方法,根本不谈性能
    HeyDMCreally
    HeyDMCreally
    OP
    Dec 6, 2015
    13
    @popok 谢谢
    imn1
    imn1
    Dec 6, 2015
    14
    python 的正则不知道是 BUG 还是特殊,当多个不确定子匹配(如.*此类涵盖全部的方式),往往得到的结果为空或不可预想
    试过相同的正则在 php 获得结果,但 py 就不行
    所以应该尽可能使用可确定的匹配,例如 [^"]+ 或者 [^<]+ 等写法
    vmebeh
    vmebeh
    Dec 6, 2015
    15
    <div\sclass\="author.+?title="(.+?)">.+?<div\sclass\="content">(.+?)</div>.+?class\="number">(\d+)</i>

    把你的改了一下可用
    <div.*?author.*?title="(.*?)".*?<div.*?class="content">(.+?)</div>.+?<i.*?class="number">(.*?)</i>
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3291 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
    ♥ Do have faith in what you're doing.