自學(xué)Python編程【第四十四節(jié)】查天氣(4)
同學(xué)們!歡迎大家來(lái)到馬哥自學(xué)Python編程教室,在上一講我們已經(jīng)可以查天氣了,但是是不是有人對(duì)城市代碼的查詢還感到不滿意呢?今天我們就這里的內(nèi)容再跟大家深入講解一下,了解一下城市代碼的抓取過(guò)程,也會(huì)讓你對(duì)網(wǎng)頁(yè)抓取有更深的理解哦。
天氣網(wǎng)的城市代碼信息結(jié)構(gòu)比較復(fù)雜,所有代碼按層級(jí)放在了很多xml為后綴的文件中。而這些所謂的“xml”文件又不符合x(chóng)ml的格式規(guī)范,導(dǎo)致在瀏覽器中無(wú)法顯示,給我們的抓取又多加了一點(diǎn)難度。
首先,抓取省份的列表:
url1 = 'http://m.weather.com.cn/data5/city.xml'
content1 = urllib2.urlopen(url1).read()
provinces = content1.split(',')
輸出content1可以查看全部省份代碼:
01|北京,02|上海,03|天津,...
對(duì)于每個(gè)省,抓取城市列表:
url = 'http://m.weather.com.cn/data3/city%s.xml'
for p in provinces:
p_code = p.split('|')[0]
url2 = url % p_code
content2 = urllib2.urlopen(url2).read()
cities = content2.split(',')
輸出content2可以查看此省份下所有城市代碼:
1901|南京,1902|無(wú)錫,1903|鎮(zhèn)江,...
再對(duì)于每個(gè)城市,抓取地區(qū)列表:
for c in cities[:3]:
c_code = c.split('|')[0]
url3 = url % c_code
content3 = urllib2.urlopen(url3).read()
districts = content3.split(',')
content3是此城市下所有地區(qū)代碼:
190101|南京,190102|溧水,190103|高淳,...
最后,對(duì)于每個(gè)地區(qū),我們把它的名字記錄下來(lái),然后再發(fā)送一次請(qǐng)求,得到它的最終代碼:
for d in districts:
d_pair = d.split('|')
d_code = d_pair[0]
ame = d_pair[1]
url4 = url % d_code
content4 = urllib2.urlopen(url4).read()
code = content4.split('|')[1]
name和code就是我們最終要得到的城市代碼信息。它們格式化到字符串中,最終保存在文件里:
line = " '%s': '%s',n" % (name, code)
result += line
同時(shí)你也可以輸出它們,以便在抓取的過(guò)程中查看進(jìn)度:
print name + ':' + code

如果你只是想抓幾個(gè)測(cè)試一下,并不用全部抓下來(lái),在provices后面加上[:3],抓3個(gè)省的試試看就好了。
恭喜你在Python自學(xué)的道路上又堅(jiān)持了一天,相信到今天為止,你可以毫無(wú)壓力地跟別人說(shuō)查詢天氣太簡(jiǎn)單了,一串代碼的事!那你了解完了如何用Python去查天氣,那你可以查詢下別的嗎?比如火車票呢?思考一下,并試著動(dòng)手實(shí)踐一下吧!更多Python相關(guān)的精彩內(nèi)容,盡在馬哥教育官網(wǎng),敬請(qǐng)關(guān)注!
好啦,今天的分享到這里就結(jié)束了,希望大家能夠持續(xù)關(guān)注馬哥教育官網(wǎng),每天都會(huì)有大量?jī)?yōu)質(zhì)內(nèi)容與大家分享!
聲明:文章來(lái)源于網(wǎng)絡(luò),侵刪!