urllib for python 3

python3中的这个代码有问题:

import urllib.request
fhand=urllib.request.urlopen('http://www.py4inf.com/code/romeo.txt')
print(fhand.read())

它的输出是:

b'But soft what light through yonder window breaks'
b'It is the east and Juliet is the sun'
b'Arise fair sun and kill the envious moon'
b'Who is already sick and pale with grief'

为什么我得到b'...' ?我能做些什么才能得到正确的答案?

正确的文本应该是

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

b'...'是一个字节字符串:一个字节数组,不是一个真正的字符串。

要转换为真正的字符串,请使用

fhand.read().decode()

这使用默认编码'UTF-8'。 对于ASCII编码,请使用

fhand.read().decode("ASCII")

例如


正如文档所述, urlopen返回一个对象,其read方法为您提供了一系列字节,而不是一系列字符。 为了将字节转换为你想要的可打印字符,你将需要应用decode方法,使用字节所在的编码。

结果似乎有意义的原因是,默认编码Python选择显示字节恰好是正确的,或者至少恰好匹配这些字符的正确字符。

为了做到这一点,你应该read().decode(encoding) encodingContent-Type HTTP头的编码值,可以通过HTTPResponse对象(也就是你的代码中的fhand )访问。 如果没有Content-Type标题,或者它没有指定编码,则可以简化为猜测使用哪种编码,但对于典型的英文文本,这并不重要,在其他许多情况下,它可能会是UTF-8。


Python 3区分字节序列和字符串。 字符串前面的“b”告诉你urllib以“raw”字节返回内容。 这可能是值得读入python 3字节/字符串的情况,但基本上,你没有得到正确的文本。 如果你不希望结果是字节,你只需要将它转换回“真正的”python字符串。

链接地址: http://www.djcxy.com/p/20899.html

上一篇: urllib for python 3

下一篇: Using arrays of arrays as pointers to expandable lists of classes in Java