初学求助……Python3 Byte串解码问题

dyycdyyc 2017-07-12 11:15:44
初学Python,尝试徒手写爬虫,然后卡死在最基础的问题上……

爬了个天气预报,基本(故障)代码是:
import urllib
import urllib.request as reqlib

def GetProvinceUrl():
try:
print('Getting province main page...')
req = reqlib.urlopen('http://www.weather.com.cn/textFC/hb.shtml')
resp = req.read().decode('utf-8') # <--sth wrong
req.close()
except:
raise(simpleException('Fail to get province info.'))
# ......


urllib库read回来的都是byte串,下面处理都是作为string的;先假设网页就是utf8编码吧,直接就上了decode('utf-8')。
现在的问题是,read()回来的数据,print一看很正常,没有一点问题。
但是decode一下,数据就只剩下末尾的一点点了。

尝试了decode('utf-8')、decode()、str(xxx, encoding='utf-8'),都是一样的结果。

read()原数据是:
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n
............
<script type="text/javascript" src="http://c.wrating.com/a1.js">\n</script>\n<script type="text/javascript">\nvar vjAcc="860010-2099040100";\r\nvar wrUrl="http://c.wrating.com/";\r\nvjTrack("");\n</script>\n<noscript>\n<img src="http://c.wrating.com/a.gif?a=&c=860010-2099040100" width="1" height="1"/>\n</noscript>\n</body>\n</html>

deocde一下就……
.js">
</script>
<script type="text/javascript">
var vjAcc="860010-2099040100";

var wrUrl="http://c.wrating.com/";

vjTrack("");
</script>
<noscript>
<img src="http://c.wrating.com/a.gif?a=&c=860010-2099040100" width="1" height="1"/>
</noscript>
</body>
</html>

一开始我猜可能print函数出bug了,但是想想后续的程序也运行的莫名其妙,没结果就算了,print一个列表或者字典,什么都不输出,连"[]"或者"{}"都没……我不由地开始怀疑人生

最后附上可能有用(应该没用)的完整代码:
import urllib
import urllib.request as reqlib
import re

class simpleException(Exception):
def __init__(self,msg):
Exception(self)
self.msg = msg

def GetProvinceUrl():
try:
print('Getting province main page...')
req = reqlib.urlopen('http://www.weather.com.cn/textFC/hb.shtml')
# TODO: 解析网页编码
resp = req.read().decode('utf-8')
req.close()
except:
raise(simpleException('Fail to get province info.'))
try:
print('Parsing province HTML...')
prvDiv = re.search(r'''(?is)<div.*?class=["']lqcontentBoxheader["'].*?>(.*?)</div>''',resp).group(1)
prvLi = re.findall(r'(?is)<li.*?>(.*?)</li>',prvDiv)
# print(prvDiv, prvLi) # and NOTHING printed
prvDict = {}
for li in prvLi:
# 获得超链接和名称
info = re.search(r'''<a.*?href=['"](.*?)['"].*?>(.*?)</a>''',li)
prvDict.setdefault(info.group(2),info.group(1))
print(info.group(2),info.group(1))
except:
raise(simpleException('Fail to parse HTML about provinces.'))
# 补全短连接
for prv in prvDict:
if prvDict[prv][0] == r'/':
prvDict[prv] = r'http://www.weather.com.cn'+prvDict[prv]
elif re.match(r'https?://*',prvDict[prv]) == None:
prvDict[prv] = r'http://'+prvDict[prv];
return prvDict


def GetCityCodes():
pass

try:
print(GetProvinceUrl())
except simpleException as e:
print(e.msg)
...全文
250 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyycdyyc 2017-07-13
  • 打赏
  • 举报
回复
引用 1 楼 chuifengde 的回复:
py3.6
 文件头加个#encoding:utf-8  
测试一切正常
多谢,加了之后输出长了一点…… 检查了一下,应该是print的锅,
# ......
>>> print(type(prvDiv))
# <class 'str'>
>>> print(prvDiv)
#
>>> for ch in prvDiv: print(ch, end='')
# blablablablabla...

# 有毒。
是不是我哪里设置错了…… 用的是Python3.4,因为os用的是xp……难道是传说中的官方bug?
似梦飞花 2017-07-13
  • 打赏
  • 举报
回复
测试没问题啊
chuifengde 2017-07-13
  • 打赏
  • 举报
回复
py3.6
 文件头加个#encoding:utf-8  
测试一切正常
dyycdyyc 2017-07-13
  • 打赏
  • 举报
回复
问题解决,这是IDE的BUG。 Sublime Text默认编码似乎是utf-8,不能正确显示中文(????),在编译配置里把编码改成cp936就行了。
内容概要:本文详细介绍了计算机中关于进制和编码的基础知识,包括Python代码的运行方式(脚本式和交互式)、计算机中常见的进制(二进制、八进制、十进制、十六进制)及其转换方法。文章还解释了计算机中的单位(bit、byte、KB、MB、GB等)以及它们之间的换算关系。接着深入探讨了编码的概念,重点介绍了ASCII编码、GB2312、GBK编码、Unicode字符集(UCS2和UCS4)以及UTF-8编码的特点和应用场景,特别是UTF-8作为全球最广泛应用的编码方式,其对Unicode字符集的高效压缩机制。最后,通过Python代码示例演示了字符与字节之间的转换过程,展示了如何使用不同的编码方式进行编码和解码。 适合人群:适合有一定编程基础的初学者,尤其是对计算机底层原理感兴趣的Python开发者或计算机科学专业学生。 使用场景及目标:帮助读者理解计算机底层数据表示的基本概念,掌握不同进制间的转换方法,熟悉各种编码方式的工作原理,能够运用Python实现简单的编码和解码操作。目标是为后续更深入的学习打下坚实的基础。 阅读建议:本文内容较为基础但非常重要,建议读者仔细阅读并尝试动手实践文中提供的Python代码示例,以加深对进制和编码的理解。同时,关注不同编码方式的区别和应用场景,有助于在实际开发中做出合适的选择。

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧