今天玩的代碼是“翻墻”訪問外網(wǎng)
python大大的圖

我的圖

這個(gè)程序是說(shuō)我們抓取了外部的網(wǎng)址"http://feeds.bbci.co.uk/news/scotland/rss.xml"把它下載到本地文件"/tmp/news.html"中。我們?cè)僮x取"/tmp/news.html"這個(gè)文件。而我們最終打印出來(lái)的內(nèi)容是把"".join(f.readlines())按照某種規(guī)則替換后的字符串,即為按行讀取"/tmp/news.html"里的內(nèi)容,換行后去掉了一些網(wǎng)頁(yè)html符號(hào),留下了適合我們?nèi)丝吹木W(wǎng)址。我特意搜了一下這個(gè)網(wǎng)址,是一則2017年7月11日蘇格蘭的新聞,說(shuō)的是最壞的人可以改變。

今天的精華部分就是urllib模塊提供的urlretrieve()函數(shù)。urlretrieve()可以直接將遠(yuǎn)程數(shù)據(jù)下載到本地。它的標(biāo)準(zhǔn)格式為:
urlretrieve(url,filename,reporthook,data)
參數(shù)url表示遠(yuǎn)程數(shù)據(jù)的路徑,一般是網(wǎng)址,可以是外部的也可以是本地的。參數(shù)filename指定了保存到本地的路徑,如果未指定該參數(shù)urllib會(huì)生成一個(gè)臨時(shí)文件來(lái)保存數(shù)據(jù)。參數(shù) reporthook 是一個(gè)回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢時(shí)會(huì)觸發(fā)該回調(diào),我們可以利用這個(gè)回調(diào)函數(shù)來(lái)顯示當(dāng)前的下載進(jìn)度。 參數(shù) data 指 post 到服務(wù)器的數(shù)據(jù),該方法返回一個(gè)包含兩個(gè)元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務(wù)器的響應(yīng)頭。
re.sub()里的re是regular expression的縮寫,表示正則表達(dá)式,sub是substitute的縮寫,表示替換。所以re.sub就是對(duì)于輸入的一個(gè)字符串,利用正則表達(dá)式(的強(qiáng)大的字符串處理功能),去實(shí)現(xiàn)(相對(duì)復(fù)雜的)字符串替換處理,然后返回被替換后的字符串。
大大補(bǔ)充說(shuō),其實(shí)這用re是過濾網(wǎng)頁(yè)html符號(hào),只顯示我們關(guān)注的文字
re.sub原型為re.sub(pattern,repl,string,count)
pattern是正則中的模式字符串。repl是replacement,指替換后的字符串。string是原字符串。count是替換個(gè)數(shù),默認(rèn)為0,表示每個(gè)匹配項(xiàng)都替換。
為了弄明白<.*?>究竟是怎樣一種替換,我把' '改成了'+',+代表了被替換的部位。而<.*?>所寫的也就是這些位置。

join用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串。join的語(yǔ)法為:
str.join(sequence)
參數(shù)sequence為要連接的元素序列。
"".join(f.readlines())是說(shuō)把f.readlines里面的內(nèi)容以join之前兩個(gè)雙引號(hào)里面的連接方式連接起來(lái),兩個(gè)雙引號(hào)里面什么也沒有,這里可能就是換行。如果我們把"".join(f.readlines())改成"=".join(f.readlines()),就可以看到j(luò)oin連接的其實(shí)是行與行之間的內(nèi)容,其實(shí)也不難理解,因?yàn)閞eadlines()是一次讀取所有內(nèi)容并按行返回list嘛。

其實(shí)想要看清楚打印出來(lái)的究竟是什么,我們不妨通過改變最后一句一步一步的來(lái)看看變化


