用正则表达式爬取链接和标题

1.爬取中国大数据首页的链接和标题

2.出现好多错误,特别是正则表达式

爬取的样式为:


部分源代码:


#coding:utf-8
import re
import urllib
#获取网页
def getHtml(url):
    page=urllib.urlopen(url)
    html=page.read()
    return html
#用正则匹配相应的链接和标题
def getText(html):
    reg=r'</span><a href="((YeJieDongTai|YingYongAnLi|JieJueFangAn|Hadoop|HBase|QiTa|JiShuBoKe)/\d{4,5}\.html)"(.*?)>(.*?)</a>'
    textre=re.compile(reg)
    textlist=re.finditer(textre,html)
    #print type(textlist)测试返回内容的类型,注意finditer和findall的区别
    return textlist

url='http://www.thebigdata.cn/'
html=getHtml(url)
list=getText(html)
#将获取的内容写入文件
a=open(r"D:\Python test\restart.txt",'a+')
for item in list:
    a.write(item.group(1)+item.group(4)+'\n')
    #当以列表形式返回时,读取方式应为:
    #a.write(item[1]+item[4]+'\n')   
a.close() 

小某说:

分享一下自己所犯的奇葩的错误。

1.刚开始写的时候,完完全全按照爬取图片的格式来的,出现一系列错误,后来发现这是不可行的。主要是对urlretrieve()的用法没有掌握清楚。urlretrieve()是将url定位到的html文件下载到本地的磁盘中,这次爬取的内容需要写入文件中。关于urllib模块中的方法可以参考

http://www.cnblogs.com/sysu-blackbear/p/3629420.html

2.然后改变方法重新爬取,正则又出现了很多错误

reg=r'target="_blank" title=(.*?)>'
这个正则爬取出来的内容有缺失,是由于源代码中有的title是写在title=“”的引号里面的,而有的写在了外面。于是便认为匹配时title可有可无,便进行更改

reg=r'target="_blank" title?=?(.*?)>'
这种写法好像很搞笑,主要是没有掌握正则中“?”的用法

?:可以表示匹配零次或一次,即前面的内容可有可无;也可以表示非贪婪匹配。重点在于后者。

常用的非贪婪匹配模式有:

  • *?重复任意次,但尽可能少重复
  • +?重复一次或更多次,但尽可能少重复

3.总之,正则匹配错误还很多。匹配成功后,如上面代码中所示,写入文件时由于有多个分组便又出现错误。主要是findall()和finditer()的区别:

findall():返回所有匹配的字符串,并存为列表,存入文件时使用列表的读取方法。

finditer():返回一个迭代器,存入文件时要调用group()


吼吼哈哈,补上昨天的博客,好开森,可能有写的不好的地方,小某就先闪啦!!


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值