2

私は BeautifulSoup4 で少し Web スクレイピングを行っていますが、応答のデコードに問題があります。Web サイトからヘッダーが返されます。ヘッダーには次のように記載されています。

コンテンツ タイプ: テキスト/html; charset=ISO-8859-1

したがって、通常は latin1 charset でデコードします。しかし、デコード後、html には次のような行があります。

<meta content="text/html; charset=utf-8" http-equiv="content-type" />

そして今、この行から文字列が正しくデコードされていません。

では、これを処理する通常の方法は何ですか?発信 http ヘッダーにaccept-encoding行を設定したいのですが、それを行う方法が見つかりませんでした。他のオプションは、新しい文字セットを検索して行ごとにデコードすることですが、utf-8 を受け入れるだけで単純に行うことをお勧めします

私はPython3、libray http.clientを使用しています

EDIT1: コード:

import http.client as cl
from bs4 import BeautifulSoup

conn = cl.HTTPConnection('www.amazon.com')
conn.request("GET", '/A-Man-For-All-Seasons/dp/B003TQ1IW6/ref=sr_1_109?s=instant-video&ie=UTF8&qid=1348337540&sr=1-109')
response = conn.getresponse()
content = response.read()

soup = BeautifulSoup(content)
f = open('am.html', 'w')
f.write(soup.prettify())

#i am actually doing this with httplib2 but result is the same

EDIT2: Linux での Beautiful Soup 4 の構成に何か問題があるか、バグのようです。これは機能していますが、BS4 で応答を解析できません:

import httplib2
h = httplib2.Http('.cache')
response, content = h.request(movieLink , headers={'accept-charset': 'latin1'})
content = content.decode('latin-1')

ありがとう、ブラッククナイト。

4

2 に答える 2

4

Beautiful Soup のドキュメントを読むと、適切なアプローチが 2 つあるようです。

  1. おそらく最善の解決策は、HTML ドキュメントを自分でデコードせずに生のバイト文字列を Beautiful Soup に渡すことです。Unicode Dammit適切なエンコーディングを見つけ出し、(付属のライブラリを使用して) ドキュメントを自動的にデコードします。関連する HTML メタ タグがあればそれを見つけて解釈するか、ドキュメントの内容を分析して推測します。これは確かに当面のケースを解決するはずであり、メタ タグのないドキュメントの場合でも、ほとんどの場合はうまくいくでしょう。ただし、ドキュメントのスキャンは少し遅くなる可能性があるため、パフォーマンスが重要な問題である場合は、次のオプションをお勧めします.

  2. 次善の策は、自分の知識を問題に適用することかもしれません。スクレイピングしているページが常に UTF-8 でエンコードされている場合は、サーバーの指示に関係なく、常にそれを使用できます。もちろん、これは一貫したページ エンコーディングに依存しており、そうである場合とそうでない場合があります (たとえば、いくつかの UTF-8 ページといくつかの Latin-1 ページを含む Web サイト)。単一のページ (または動的サイトの単一タイプのページ) のみをスクレイピングしている場合、常に同じエンコーディングを見つける可能性が高いため、これはうまく機能します。このアプローチの利点は、その単純さ (そして程度は劣るが速度) ですが、柔軟性と堅牢性が犠牲になります。サイトが使用するエンコーディングを変更すると、スクリプトが壊れる可能性があります。

于 2012-09-22T22:41:53.173 に答える