关闭

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

标签: 正则表达式
987人阅读 评论(0) 收藏 举报
分类:

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()


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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32834次
    • 积分:567
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:7篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论