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()
吼吼哈哈,補上昨天的博客,好開森,可能有寫的不好的地方,小某就先閃啦!!