Python 2与Python 3-urllib格式

2024-05-23 20:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经厌倦了试图找出为什么这段代码在Python 2而不是Python 3中工作。我只是想获取一个json页面,然后解析它。下面是Python2中的代码:

import urllib, json
response = urllib.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)

我认为Python 3中的等价代码是:

import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)

但它在我面前爆炸了,因为read()返回的数据是“字节”类型。然而,在我的一生中,我不能让它转换成json能够解析的东西。我知道reddit试图将utf-8发送回我,但我似乎无法将字节解码为utf-8:

import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content.decode("utf8"))

我做错什么了?

编辑:问题是我无法使数据进入可用状态;即使json加载了数据,其中一部分是不可显示的,我希望能够将数据打印到屏幕上。

第二次编辑:这个问题似乎更多地与打印有关,而不是与解析有关。Alex的答案通过将IO设置为utf8,为脚本在Python 3中工作提供了一种方法。但仍然存在一个问题:为什么代码在Python 2中工作,而不是在Python 3中工作?


Tags: 数据代码importcomjsonhttpreaddata
3条回答

请参阅另一个Unicode相关问题中的that答案。

现在:Python 3str(这是Python 2unicode)类型是一个理想化的对象,它处理的是“字符”,而不是“字节”。这些字符,为了用于/来自磁盘/网络数据,需要通过“转换表”(即编码a.k.a代码页)对字节进行编码/解码。由于操作系统的多样性,Python在历史上避免猜测该编码是什么;多年来这种情况一直在改变,但仍然适用“面对模糊,拒绝猜测的诱惑”的原则。

谢天谢地,web服务器使您的工作更轻松。上面的response应该会给您提供所需的所有额外信息:

>>> response.headers['content-type']
'application/json; charset=UTF-8'

因此,每次向web服务器发出请求时,都要检查内容类型头中的字符集值,并使用该字符集将请求的数据解码为Unicode(Python3:bytes.decode(charset)str)。

您发布的代码可能是由于错误的剪切和粘贴操作造成的,因为这两个版本中都明显是错误的(f.read()失败,因为没有定义fbarename)。

在Py3中,ur = response.decode('utf8')对我来说非常好,下面的json.loads(ur)也是。可能是错误的复制和粘贴影响了您的2到3转换尝试。

取决于python版本,您必须选择正确的库。

对于python 3.5

import urllib.request
data = urllib.request.urlopen(url).read().decode('utf8')

对于Python2.7

import urllib
url = serviceurl + urllib.urlencode({'sensor':'false', 'address': address})   
uh = urllib.urlopen(url)

相关问题 更多 >