获取URL并转换为UTF-8 Python



我想用python做我的第一个项目,但我在编码方面有问题。当我获取数据时,它显示的是编码字母而不是我的母语字母,例如"\xc4\x87"而不是"ć"。代码如下:

import urllib.request
import sys
page = urllib.request.urlopen("http://olx.pl/")
test = page.read()
print(test)
print(sys.stdin.encoding)
z = "ł"
print(z)
print(z.encode("utf-8"))

我知道这里的代码很差,但我尝试了许多选项来更改编码。我写了z="ł"来检查它是否可以打印任何"特殊"字母,并且它会显示出来。我试着对它进行编码,它也能正常工作。Sys.stdin.encoding显示cp852。

urlopen()响应中读取的数据是编码数据。您需要首先使用正确的编码解码该数据。

您似乎下载了UTF-8数据;在你有文本之前,你必须先解码这些数据:

test = page.read().decode('utf8')

但是,由服务器来告诉您收到了哪些数据。检查标题中的字符集:

encoding = page.info().getparam('charset')

这仍然可以是None;许多数据格式包括编码作为格式的一部分。例如,XML默认为UTF-8,但开头的XML声明可以包含有关该文档使用的编解码器的信息。XML解析器会提取这些信息,以确保在解析时获得正确解码的Unicode文本。

您可能无法打印该数据;852代码页只能处理256个不同的代码点,而Unicode标准要大得多。

urlopen将返回一个字节对象。这意味着它是一个原始的、编码的字节流。Python3以repr格式打印,该格式对非ASCII字符使用转义码。要获得规范的unicode,您必须对其进行解码。正确的方法是检查标头并查找编码声明。但为此,我们可以假设UTF-8,您可以简单地解码,而不是编码它

import urllib.request
import sys
page = urllib.request.urlopen("http://olx.pl/")
test = page.read()
print(test.decode("utf-8"))  # <- note change

现在,Python3默认使用UTF-8源代码编码。因此,如果编辑器支持unicode并保存为UTF-8,则可以像这样嵌入非ASCII。

z = "ł"
print(z)

只有当您的终端支持UTF-8编码时,才能打印它。在Linux和OSX上,它们是这样做的,所以这不是问题。

其他的都是正确的,但我想提供一个更简单的解决方案。使用requests。它是第三方,所以你需要通过pip:安装它

pip install requests

但是它的使用要比urllib库简单得多。对于您的特定情况,它会开箱即用地为您处理解码:

import requests
r = requests.get("http://olx.pl/")
print(r.encoding)
# UTF-8
print(type(r.text))
# <class 'str'>
print(r.text)
# The HTML

细分:

  • CCD_ 5向服务器发送HTTP CCD_
  • 编码requestsprint认为文本在其中。它根据Martijin提到的响应标头来选择这个
  • 我们展示了r.text已经是解码文本类型(Python 2中的unicode和Python 3中的str(
  • 然后我们实际上print响应

注意,我们没有到print的编码或类型;我这样做只是为了诊断目的,以显示requests在做什么。requests旨在简化处理HTTP请求的许多其他细节,并且它做得很好。

相关内容

  • 没有找到相关文章

最新更新