设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生
打印 上一主题 下一主题

【Python 第46课】 查天气(4)

  [复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

41#
发表于 2015-10-9 11:50:42 |只看该作者
陈小六 发表于 2015-10-8 15:52
基本就是按照教程上来的,加了几个暂停,输出一部分以后就报错了~
北京:101010100
海淀:101010200

数组越界了,没有[1]这个元素
你把content4也打印出来,看看是什么情况下出错了
然后对这种情况加上异常处理
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

34

积分

新手上路

Rank: 1

42#
发表于 2015-11-8 19:35:21 |只看该作者
本帖最后由 我是佩佩学姐 于 2015-11-8 23:34 编辑

基本上也是参照楼上陈小六的代码,我这边出现问题:
1、在content4 那行出现错误,IndexError: list index out of range 。对应print content4:
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <script type="text/javascript">
  6.         window.onload = function() {
  7.         window.open("/","_self");
  8.         };
  9.         </script>
  10. <!-- START WRating v1.0 -->
  11. <script type="text/javascript" src="http://c.wrating.com/a1.js">
  12. </script>
  13. <script type="text/javascript">
  14. var vjAcc="860010-2151010100";
  15. var wrUrl="http://c.wrating.com/";
  16. vjTrack("");
  17. </script>
  18. <noscript><img src="http://c.wrating.com/a.gif?a=&c=860010-2151010100" width="1" height="1"/></noscript>
  19. <!-- END WRating v1.0 -->
  20. </body>
  21. </html>
复制代码
2、502 bad gateway 或者504 gate time-out
  1.         for d in districts:
  2.             d_pair=d.split('|')
  3.             d_code=d_pair[0]
  4.             name=d_pair[1]
  5.             url4=url % d_code
  6.             time.sleep(0.5)                  
  7.             content4=urllib2.urlopen(url4).read()    #这个地方经常出现错误。502 bad gateway 或者504 gate time-out
  8.             code = content4.split('|')[1]
  9.             line="    '%s': '%s',\n" % (name,code)
  10.             result+=line
  11.             print name.decode('utf-8')+':'+code
复制代码
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

43#
发表于 2015-11-9 21:01:56 |只看该作者
我是佩佩学姐 发表于 2015-11-8 19:35
基本上也是参照楼上陈小六的代码,我这边出现问题:
1、在content4 那行出现错误,IndexError: list index  ...

这个看起来是接口那里超时或者封掉了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

34

积分

新手上路

Rank: 1

44#
发表于 2015-11-11 21:27:19 |只看该作者
crossin先生 发表于 2015-11-9 21:01
这个看起来是接口那里超时或者封掉了

可是每次都能查一会才会出现问题,IndexError: list index out of range 或者是502 bad gateway 、504 gate time-out。感觉不是被封掉?超时有什么办法么?
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

45#
发表于 2015-11-12 13:04:55 |只看该作者
我是佩佩学姐 发表于 2015-11-11 21:27
可是每次都能查一会才会出现问题,IndexError: list index out of range 或者是502 bad gateway 、504 ga ...

增加异常处理,如果没成功,就sleep两秒钟重试
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

34

积分

新手上路

Rank: 1

46#
发表于 2015-11-12 20:46:45 |只看该作者
本帖最后由 我是佩佩学姐 于 2015-11-12 20:48 编辑

非常感谢Cossin先生指点。作为一个从未编程的人,调试完查天气的四节,相当吃力但是收获很多。(推荐用IDLE调试运行)
我按照先生的指点,在每个urlopen面前都增加了异常处理,目前程序调试成功。
现阶段有还有两个关于编码的疑问,还是吃不透,有点晕:
1、为什么在IDLE里面每次运行程序都要提示默认加cp936,但是我们在程序里面的变量如name就必须要用utf8解码才有效?(我试过改成cp936,要么乱码,或者会报错什么gbk....记不清了哈)
2、最后一步,将结果写入,f.write(result) ,我需要去掉result后面的.encode('cp936')才能写入(否则报错:UnicodeDecodeError: 'gbk' codec can't decode bytes in position 122-123: illegal multibyte sequence),如果换成utf-8,一样出错。

按老师指点,增加异常处理后的代码(部分):
  1.             try:
  2.                 time.sleep(1.0)
  3.                 content4=urllib2.urlopen(url4).read()
  4.                 code = content4.split('|')[1]
  5.                 line="    '%s': '%s',\n" % (name,code)
  6.                 result+=line
  7.                 print name.decode('utf-8')+':'+code
  8.             except:
  9.                 print'%s:查询失败'%name.decode('utf-8')

  10. result+='}'
  11. f=file('city2.py','w')
  12. f.write(result) #需要去掉encode...
  13. f.close()
复制代码
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

47#
发表于 2015-11-13 15:58:32 |只看该作者
我是佩佩学姐 发表于 2015-11-12 20:46
非常感谢Cossin先生指点。作为一个从未编程的人,调试完查天气的四节,相当吃力但是收获很多。(推荐用IDLE ...

python2里面的编码的确是个比较讨厌的东西,有机会我再好好整理一下。

粗略来说,idle提示cp936,是指你文件本身的编码,在win下默认是cp936,你也可以指定utf8
变量的编码,是变量存储的字符串的编码,这个牵涉到从网站上读取下来的时候,网页的编码是什么
而且因为不同系统的默认编码不一样,所以同一段代码未必每个平台都能正常运行
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

200

积分

中级会员

Rank: 3Rank: 3

48#
发表于 2015-12-10 21:40:35 |只看该作者
我是佩佩学姐 发表于 2015-11-12 20:46
非常感谢Cossin先生指点。作为一个从未编程的人,调试完查天气的四节,相当吃力但是收获很多。(推荐用IDLE ...

请教一下佩佩学姐,因为你跟我的学习时间比较近....
第46课的链接都失效了,推荐文章的链接也失效了,你怎么完成这个程序的....
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

49#
发表于 2015-12-11 21:54:47 |只看该作者
book 发表于 2013-8-6 13:22
您好,这里是[0] 还是[1],我运行了好多次,抓的过程中,总是出错,每次都出在urllib2.urlopen().read(), ...

你把每一步的值都print出来看,看到底是哪里跟预想的不对了
有可能是网络问题,网络问题的话会有相应的报错的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

50#
发表于 2015-12-11 21:55:25 |只看该作者
周末晒被子 发表于 2015-12-10 21:40
请教一下佩佩学姐,因为你跟我的学习时间比较近....
第46课的链接都失效了,推荐文章的链接也失效了,你 ...

这个链接要去找新的
查天气1最上面给了两个博客,不过我现在没验证最新的还能不能正常
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-19 23:45 , Processed in 0.032354 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部