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

2015-12-05 21:04:17 +08:00
 HeyDMCreally

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)
三个合起来的不出结果,不知是什么问题
后面试着改了几次,结果有几次输出八进制
这是写的爬糗百的。。,求指点

1918 次点击
所在节点    正则表达式
15 条回复
halfcrazy
2015-12-05 21:46:34 +08:00
HeyDMCreally
2015-12-05 22:11:45 +08:00
@halfcrazy 谢谢 不过问题纠结了很久 想知道是哪里表达错了
halfcrazy
2015-12-05 22:15:13 +08:00
@halfcrazy 方便把要匹配的字串贴出来么
HeyDMCreally
2015-12-05 22:18:55 +08:00
iEverX
2015-12-05 22:59:28 +08:00
@HeyDMCreally 发一个你要匹配的字符串,就是你程序里面的 content
lecher
2015-12-05 23:26:59 +08:00
我也犯过类似的错误,正则尽量不要用(.*)这样会导致最长匹配,结果就是本意是匹配一串列表的最终匹配出一大段 html 代码。

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

.*? -> [/s/S]*?
HeyDMCreally
2015-12-05 23:33:01 +08:00
bdbai
2015-12-05 23:58:08 +08:00
@lecher .*? 大法好
Victor215
2015-12-06 00:08:15 +08:00
这东西分开还能看明白 合起来完全不知道是什么鬼,就算你改好了 放一段时间回来看我相信你肯定也是看不懂的 能简单的分开的就不要合并起来 我觉得能多匹配几次匹配出来就行
popok
2015-12-06 00:29:45 +08:00
@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
2015-12-06 00:31:59 +08:00
能分开匹配还是分开比较好点
我的方法是,先 content 写入测试工具,然后把需要匹配那段复制出来,写到正则那栏,然后把其中变化的部分都用正则表示,然后换行都改成\s+,然后就能用了。

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

把你的改了一下可用
<div.*?author.*?title="(.*?)".*?<div.*?class="content">(.+?)</div>.+?<i.*?class="number">(.*?)</i>

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

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

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

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

© 2021 V2EX