第2个爬虫教程的大坑,关于正则表达式的括号与竖线

来源:互联网 发布:mac上打卡文件 编辑:程序博客网 时间:2024/05/21 06:24

Python实战:Python爬虫学习教程,获取电影排行榜

http://www.toutiao.com/i6321943520135348737/?group_id=6321939698362384641&group_flags=0
应该说是一个不错的教程,也是我的第一个爬虫入门教程,但是有一处值得注意:

=======================割====================================

我们可以看到我们想要的热搜的内容都是如下结构:

<a target="_blank" title="标题" data="26|26" class="list-title" href="链接" href_top="说明">电影名称</a>

所以我们就可以按照如上内容写正则表达式,然后在html源代码中匹配出来电影名称就可以了

我们正则表达式可以这样写

<a target="_blank" title=".+?" data="26|26" class="list-title" href=".+?" href_top=".*?">.*?</a>

Python实战:Python爬虫学习教程,获取电影排行榜

=======================割====================================


注意,外面的代码与截图中的是不一样的,截图中的是正确的版本,用于提取的内容,要加括号,常用的是(.*?)

此外,在个人调试中,也发现了竖线需要加转义字符反斜杠。

可以参见:

Python爬虫实战一之爬取糗事百科段子

http://cuiqingcai.com/990.html

=======================割====================================



我们可以看到,每一个段子都是<div class=”article block untagged mb15″ id=”…”>…</div>包裹的内容。

现在我们想获取发布人,发布日期,段子内容,以及点赞的个数。不过另外注意的是,段子有些是带图片的,如果我们想在控制台显示图片是不现实的,所以我们直接把带有图片的段子给它剔除掉,只保存仅含文本的段子。

所以我们加入如下正则表达式来匹配一下,用到的方法是 re.findall 是找寻所有匹配的内容。方法的用法详情可以看前面说的正则表达式的介绍。

好,我们的正则表达式匹配语句书写如下,在原来的基础上追加如下代码

content = response.read().decode('utf-8')
pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
                         'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
    print item[0],item[1],item[2],item[3],item[4]

1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。





0 0