Howdy folks、なぜこのUTF-8ページをデコードできないのですか?
私は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')
そして、私は期待したいですHTMLの文字列であることをdataStringため、
<!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を使用してエンコードされていないことであることが示唆されますが、ページの文字セットと美しいスープのUnicodeDammit()クレームの両方ましたそれはUTF-8です(2番目は最初のものかもしれません)。 chardet.detect()はコード化を示唆していません。
ラテン-1
のWindows-1252
ISO-8859-1:私は無駄に 'UTF-8' デコードのエンコーディングパラメータの()のために、以下に置き換えて試してみました
おそらく言及する価値があるのは、バイト配列データが期待通りに見えないということです。作業URLから:[10]:ここではデータだ
b'\n<!DOCTYPE'
ここでのデータです[:10] 538サイトから:
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
がアップ何ですか?
'wget'でデータを取得するとgzipで圧縮されたファイルが提供されます。これは圧縮されておらず、通常のUTF-8 HTMLページを提供します。おそらくサーバーがひどく構成されており、関連するヘッダーを設定せずに圧縮されたページを提供します。 –
( 'file.headers ['content-encoding']'を見てください。) – Ryan
@Ryan:実際に 'gzip'を' content-encoding'に設定しているようですが、 'curl'と' wget'のどちらもそれについて何もしません通常、トランスポートレベルの圧縮を透過的に処理するので、奇妙です。このサーバの動作には、何か変わったことがなければなりません。 –