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

2015 年 3 月 18 日
 dedewei
页面: 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之后用.+?跳过中间匹配(电影描述),--- .+?这里跳过不行,该怎样处理?

谢谢
3920 次点击
所在节点    Python
19 条回复
imn1
2015 年 3 月 18 日
有没有用参数把圆点包括换行符?
wangfeng3769
2015 年 3 月 18 日
beautifullsoup 可以自己搞。
dedewei
2015 年 3 月 18 日
@imn1 .+? 这个没有跳过换行的吗? 用什么参数?能给个示例么.....谢谢。 也google去!
dedewei
2015 年 3 月 18 日
@wangfeng3769 就匹配几十个页面,正则会快点吧
zhy0216
2015 年 3 月 18 日
不要用正则爬网页...
dedewei
2015 年 3 月 18 日
@imn1 用你给的提示换行搞掂了,把 .+? 换成 [\s\S]*
非常感谢!!!
zhy0216
2015 年 3 月 18 日
imn1
2015 年 3 月 18 日
建议善用排除正则,(?!(?:排除的字串)).*?
另外,py中正则的贪婪和非贪婪和我预想的差距很大,特别是 findall 多组匹配的时候,注意改动一下观察结果
dedewei
2015 年 3 月 18 日
@zhy0216 匹配几十个页面,正则会快点?
dedewei
2015 年 3 月 18 日
@imn1 刚发现结果不对..哭.....
dedewei
2015 年 3 月 18 日
@imn1 还是没看懂,我再看看...
dedewei
2015 年 3 月 18 日
@zhy0216 读了几遍,没懂...
dedewei
2015 年 3 月 18 日
@imn1 原来是忘了添加 re.DOTALL 参数,问题已解决。谢谢
imn1
2015 年 3 月 18 日
@dedewei
parse 几十个页面正则没有明显优势,但是如果几万个页面,正则花费时间是 lxml 的2/3或更少,bs4就更不用说了,载入页面dom是很耗资源的

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

(?!(?:\<p class……)).*? 代替中间你要无视的那段字串,你去查查这种写法,自己做几个例子就明白了
另外findall 做单句正则分组匹配真的很烦,有时用*和+结果相差甚远(有字符的情况),我经常要调试好几次才成功
libo26
2015 年 3 月 18 日
表示用Beautifulsoup挺方便的
frankzeng
2015 年 3 月 18 日
Beautifulsoup或xpath,为什么非要用虐心的正则表达式,写正则表达式可费脑了
mutoulbj
2015 年 3 月 18 日
pyquery大法好~
dedewei
2015 年 3 月 19 日
@imn1 多谢指导!
dedewei
2015 年 3 月 19 日
@frankzeng 小白,一切以运行成功为目的.....不过正则真的很痛苦.....

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

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

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

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

© 2021 V2EX