获取 URL 并转换为 UTF-8 Python

Fetching URL and converting to 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 = "ł" 来检查它是否可以打印任何 'special' 字母并且它显示了。我试着对它进行编码,它也能正常工作。 Sys.stdin.encoding 显示 cp852。

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

您似乎下载了 UTF-8 数据;您必须先解码该数据,然后才能获得文本:

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

但是,由服务器告诉您收到了什么数据。检查 headers:

中的字符集
encoding = page.info().getparam('charset')

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

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

urlopen 返回给您 bytes object。这意味着它是原始的编码字节流。 Python 3 以 repr 格式打印,该格式使用 non-ASCII 字符的转义码。要获得规范的 unicode,您必须对其进行解码。正确的做法是检查 header 并查找编码声明。但是为此我们可以假定 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,您可以像这样嵌入 non-ASCII。

z = "ł"
print(z)

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

其他的都是正确的,但我想提供一个更简单的解决方案。使用 requests。这是第 3 方,因此您需要通过 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

细分:

  • get 向服务器发送 HTTP GET 请求和 returns 响应。
  • 我们 print 编码 requests 认为文本在其中。它根据 Martijin 提到的响应头选择它。
  • 我们表明r.text已经是一个解码的文本类型(unicode in Python 2 and str in Python 3)
  • 然后我们实际上print响应。

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