And*_*ino 4 python encoding utf-8 character-encoding
各位好,
我是使用 python 从网络获取数据的新手。我想在字符串中包含此页面的源代码: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')
Run Code Online (Sandbox Code Playgroud)
我希望 dataString 是一串 HTML(在这种特定情况下,我的期望见下文)
<!DOCTYPE html><html lang="en"><head><meta property="article:modified_time" etc etc
Run Code Online (Sandbox Code Playgroud)
相反,对于 538 网站,我收到此错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
Run Code Online (Sandbox Code Playgroud)
我的研究表明问题在于我的文件实际上并未使用 UTF-8 编码,但是页面的字符集和 beautiful-soup 的 UnicodeDammit() 都声称它是 UTF-8(第二个可能是因为第一个)。chardet.detect() 不建议任何编码。我尝试在 decode() 的编码参数中用以下内容替换 'UTF-8' 无济于事:
ISO-8859-1
拉丁语 1
视窗-1252
也许值得一提的是字节数组数据看起来不像我期望的那样。这是来自工作 URL 的 data[:10]:
b'\n<!DOCTYPE'
Run Code Online (Sandbox Code Playgroud)
这是来自 538 站点的数据 [:10]:
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
服务器为您提供了 gzip 压缩的数据;这并不完全常见,因为urllib默认情况下不设置任何accept-encoding值,因此服务器通常保守地不压缩数据。
尽管如此,content-encoding响应的字段已设置,因此您可以知道您的页面确实是 gzip 压缩的,并且您可以gzip在进一步处理之前使用 Python模块对其进行解压缩。
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')
Run Code Online (Sandbox Code Playgroud)
OTOH,如果你有使用的可能性requests会处理本身这一切混乱,包括压缩模块(我说过,你还可以得到deflate另外gzip,这是一样的,但不同的标题?)和(至少部分地)编码.
import requests
webAddress = "https://projects.fivethirtyeight.com/2018-nba-predictions/"
r = requests.get(webAddress)
print(repr(r.text))
Run Code Online (Sandbox Code Playgroud)
这将执行您的请求并正确打印出已解码的 Unicode 字符串。
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |