gpt4 book ai didi

python - 为什么我不能解码这个 UTF-8 页面?

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:46 24 4
gpt4 key购买 nike

大家好,

我刚开始使用 Python 从 Web 获取数据。我想把这个页面的源代码放在一个字符串中: https://projects.fivethirtyeight.com/2018-nba-predictions/

以下代码适用于其他页面(例如 https://www.basketball-reference.com/boxscores/201712090ATL.html ):

import urllib.request
file = urllib.request.urlopen(webAddress)
data = file.read()
file.close()
dataString = data.decode(encoding='UTF-8')

我希望 dataString 是一个 HTML 字符串(请参阅下文了解我在这种特定情况下的期望)

<!DOCTYPE html><html lang="en"><head><meta property="article:modified_time" etc etc

相反,对于 538 网站,我收到此错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

我的研究表明问题是我的文件实际上不是使用 UTF-8 编码的,但是页面的字符集和 beautiful-soup 的 UnicodeDammit() 都声称它是 UTF-8(第二个可能是因为第一个). chardet.detect() 不建议任何编码。我试过在 decode() 的编码参数中用以下内容替换 'UTF-8' 但无济于事:

ISO-8859-1

拉丁-1

Windows-1252

也许值得一提的是字节数组数据看起来不像我期望的那样。这是来自有效 URL 的数据[:10]:

b'\n<!DOCTYPE'

这是来自 538 站点的数据[:10]:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

怎么了?

最佳答案

服务器为您提供了 gzip 压缩数据;这并不完全常见,因为默认情况下 urllib 不设置任何 accept-encoding 值,因此服务器通常保守地不压缩数据。

仍然设置了响应的content-encoding字段,所以你有办法知道你的页面确实是gzip压缩的,你可以解压它在进一步处理之前使用 Python gzip 模块。

import urllib.request
import gzip
file = urllib.request.urlopen(webAddress)
data = file.read()
if file.headers['content-encoding'].lower() == 'gzip':
data = gzip.decompress(data)
file.close()
dataString = data.decode(encoding='UTF-8')

OTOH,如果你有可能使用 requests模块它将自行处理所有这些困惑,包括压缩(我是否提到过除了 gzip,您还可能得到 deflateis the same but with different headers?)和(至少部分地) 编码。

import requests
webAddress = "https://projects.fivethirtyeight.com/2018-nba-predictions/"
r = requests.get(webAddress)
print(repr(r.text))

这将执行您的请求并正确打印出已解码的 Unicode 字符串。

关于python - 为什么我不能解码这个 UTF-8 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47740693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com