用正則表達式爬取鏈接和標題

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


吼吼哈哈,補上昨天的博客,好開森,可能有寫的不好的地方,小某就先閃啦!!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章