#coding:UTF-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')
def ShowWeather(city):
res =str(city).split('" title="')
print res[1],'(白天-->夜间)'
html=requests.get("http://www.tianqihoubao.com/weather/{0}".format(res[0]))
weather=re.search('<table width="100%" border="0" class="b" cellpadding="1" cellspacing="1">(.*?)</table>', html.text,re.S).group(1)
res=re.findall('<tr>(.*?)</tr>', weather,re.S)
for x in res[2:]:
w = re.findall('>(.*?)<', x,re.S)
for y in w[1:]:
if len(y.strip())<=0:
pass
else:
print y
print '--'*40
print '\n','*'*40
def ShowCity():
html=requests.get("http://www.tianqihoubao.com/weather/province.aspx?id=420000")
citys= re.findall('<td style="height: 22px" align="center"><a href="(.*?)">', html.text,re.S)
for city in citys:
ShowWeather(city)
def main():
ShowCity()
if __name__=='__main__':
main()
是的,你没有看错,短短34行代码就可以爬取湖北省所有的主要城市1个月的所有天气情况,是不是很厉害呀!!???不过不要高兴的太早,凡事有利有弊,看看它的运行结果吧:[Finished in 371.8s]
3.知识总结:
3.1.编码问题:
#在ubuntu上,由于编码问题,我们需要在代码的开始位置添加一行注释,告诉Pyhton解释器我们指定的编码格式:
#此外,我们还需要设置默认的编码格式,否则Sublime Text会无法识别中文,报告一个错误:“UnicodeEncodeError: 'ascii' codec can't encode characters in position”
#-*-coding:utf8-*-
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')
3.2.正则表达式:
导入正则表达式库:import re
匹配任意字符:.
匹配前一个字符0次或无限次:*
匹配前一个字符0次或一次:?
贪心算法:.*
非贪心算法:.*?
匹配数字:(\d+)
常用函数:
re.findall(pattern, string)
re.search(pattern, string)
re.sub(pattern, repl, string)
最后的最后,如果你尝试过运行我贴出来的完整代码,或许你会遇到和我一样的瓶颈,就是运行的速度不够快(尤其像我这种机器配置不是很好的电脑)。在我的机器上运行这段脚本总共花费了 371.8s。我运行过多次,每次都是在350+。因此,如果你的程序不在乎运行速度,那么可能Python还是挺适合的,毕竟可以通过它写更少的代码去做更多的事情!!!!