发现更大的SEO世界
 找回密码
 注册
搜索
»首页»SEO培训 SEO论坛 SEO交流 帖子
发新帖
ZERO,SEO执着爱好者    

人人会Python系列(2)——采集网页分析数据的正则表达式re模块

正则表达式,虽然看上去是个麻烦的东西,但我的团队成员都需要会这个,因为在很多场合都要用到它。

比如在赶集的时候,数据是这样保存着的:
bj        /zpsiji/        北京司机招聘        /zhaopin/list
bj        /gongsi/123/        北京XXX公司        -

要计算招聘栏目的总流量,即需要用到简单的正则表达式:/zhaopin/|/gongsi/

又如大批量交换链接的时候,当时采用过北京子域名某页面换别人北京对应页面、上海子域名某页面换别人上海对应页面……但每个网站城市子域名的URL都不同,有些为bj,有些beijing,这时候两两匹配就要通过程序处理。先要到两个网站的城市列表页面,提取出城市名及URL,计算两个网站的城市名交集。在页面上提取城市名及URL的步骤,就需要用到正则表达式。当时这些都是换链接的人来处理的。(所以换链接也不是谁都能做好的事)

下面就以提取一个城市选择页面上的城市名及URL特征为例,说下re模块的用法:

  1. <div id="city">
  2.         <a href="http://bj.xxx.com/">北京</a>
  3.         <a href="http://sh.xxx.com/">上海</a>
  4. </div>
复制代码


需要两步,先把城市链接这一整块提取出来(以免不慎匹配其它不相关链接),再从这块里面提取所有链接,于是代码为:

  1. import re

  2. html = '''
  3. <div id="city">
  4.         <a href="http://bj.xxx.com/">北京</a>
  5.         <a href="http://sh.xxx.com/">上海</a>
  6. </div>
  7. '''

  8. area = re.search('<div id="city">([\s\S]+?)</div>', html).group(1)
  9. links = re.findall('<a.*?href="http://(.+?)\..+?>(.+?)</a>', area)

  10. for host, city in links:
  11.         print host, city
复制代码


稍解释下,[\s\S]+?指的是匹配空白字符(\s)在内的一大段任意内容(不跨行的匹配可以用.+?)

group(1)指的是前面第一个括号里面匹配到的内容

findall里面的括号匹配到的内容会直接返回


在大规模数据分析的情况下,在每次使用正则表达式之前,有必要编译正则表达式,以提升运行速度。是否有编译过正则表达式,大规模数据下效率相差很明显,本来300秒处理完的脚本,可能编译正则后仅需要10秒。

代码示例:

  1. import re

  2. reg = re.compile('/category/.*?\.htm')

  3. count = 0
  4. for line in open(f):
  5.         if reg.search(line):
  6.                 count += 1
  7. print count
复制代码

评分

参与人数 2赞同 +8 收起 理由
草根网络营销 + 4 赞一个!
lycfaint + 4 老大这个系列做下去,一定会成为SEOpython.

查看全部评分

发表于 2014-7-9 16:11:53 |只看大图
回复 收藏
vic,请到个人资料页面设置个人签名    [ 版主 ]

好东西  呵呵
发表于 2014-7-10 11:13:18
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

py正则表达式怎么编译?
发表于 2014-7-10 22:49:23
回复 收藏
ZERO,SEO执着爱好者    

莫山 发表于 2014-7-10 14:49
py正则表达式怎么编译?

re.compile()
 楼主| 发表于 2014-7-11 09:49:37
回复 收藏
老狼,老狼博客 www.lanzhihui.com    [ 版主 ]

继续学
发表于 2014-7-11 09:54:18
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    

zero老大,能问个不算python的问题么?不过是awk里面的正则的问题:"$7~/^\/20140713\/[[:digit:]]+\.shtml/ {print $7}",可是我用\d居然不可以(哭),可是用digit这个的话,没法指定位数啊,最近用的还不考虑多少位,但是我可以预料到的将来的统计一定会用到统计指定\d的位数的。怎么办?(http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html,这是前段时间学re的一个链接)
发表于 2014-7-14 20:48:03
回复 收藏
ZERO,SEO执着爱好者    

lycfaint 发表于 2014-7-14 12:48
zero老大,能问个不算python的问题么?不过是awk里面的正则的问题:"$7~/^\/20140713\/[[:digit:]]+\.shtml ...

不会awk。
 楼主| 发表于 2014-7-15 09:49:03
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    


额?那老大你平时分析网站日志用啥?我现在就靠着这个指令来拆分日志了。。。。
发表于 2014-7-15 11:50:16
回复 收藏
ZERO,SEO执着爱好者    

lycfaint 发表于 2014-7-15 03:50
额?那老大你平时分析网站日志用啥?我现在就靠着这个指令来拆分日志了。。。。 ...

简单的分析可以仅用grep处理,复杂的处理python也比awk更适合。
 楼主| 发表于 2014-7-15 13:54:55
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    

本帖最后由 lycfaint 于 2014-8-4 17:50 编辑
ZERO 发表于 2014-7-15 13:54
简单的分析可以仅用grep处理,复杂的处理python也比awk更适合。


老大,问个问题,我用你的这个代码做了一个小程序,想测试网页是否被收录的。
k= open('d:/workspace/result.txt','w')#放结果的txt
with open('d:/workspace/keyword.txt','r') as f: #放需要测试的网页地址
    for line in f.readlines():
        kw=line.strip()
        html=serprs.curl('http://www.baidu.com/s?wd=' + urllib.quote_plus(kw))#把正文中的curl那个模块封装近serprs里面了
        if '没有找到' in html:
            l='未收录'   
        else:
            l='已收录'
        print "'"+kw+"'"+"查完了"
        k.write(kw+' '+l+'\n')
k.close()
但是程序界面一直显示一条都没有执行(之前用了一个错了,跑了6K条,然后不动了,才发现有问题,没找到也会报找到,就改了这个)
我怀疑是百度把我的IP给禁了?还是我程序写的有问题?
发表于 2014-8-4 17:49:51
回复 收藏
ZERO,SEO执着爱好者    

lycfaint 发表于 2014-8-4 09:49
老大,问个问题,我用你的这个代码做了一个小程序,想测试网页是否被收录的。
k= open('d:/workspace/res ...

因为curl方法默认有出错自动重试功能,如果有错误会一直循环。可以尝试curl(url, debug=True),这样会输出错误信息方便排查。
 楼主| 发表于 2014-8-4 17:58:18
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    

ZERO 发表于 2014-8-4 17:58
因为curl方法默认有出错自动重试功能,如果有错误会一直循环。可以尝试curl(url, debug=True),这样会输 ...

明白,多谢老大~
发表于 2014-8-5 09:00:17
回复 收藏
lycfaint,好好学习SEO,争取从穷屌丝变成会SEO的屌丝    

本帖最后由 lycfaint 于 2014-8-5 17:17 编辑
ZERO 发表于 2014-8-4 17:58
因为curl方法默认有出错自动重试功能,如果有错误会一直循环。可以尝试curl(url, debug=True),这样会输 ...


昨天下午跑一直没有结果,今天早上来就可以有结果了,是否是因为百度ban掉了?

下午折腾了一下午python中文编码的问题,终于搞定。但是跑了一半之后,陆续出错(就是curl(url,debug=true)之后)。其中三次报错的截图,老大能否指点一下,解决方向?

错误.jpg (52.56 KB, 下载次数: 344)

curl报错1connect 错误

curl报错1connect 错误

错误2.jpg (46.62 KB, 下载次数: 288)

错误2.jpg

错误3.jpg (43.6 KB, 下载次数: 304)

错误3.jpg
发表于 2014-8-5 10:26:36
回复 收藏
,请到个人资料页面设置个人签名    

回复内容已删除
匿名  发表于 2014-9-20 20:55:35
回复 收藏
快速回复 返回顶部 返回列表