1

HTML サイトを解析する次のコードがあります。これは HTML 要素オブジェクトを返します。このコードを複数のマシンで実行したいので、誰かがプロキシの背後から実行しようとしたときにプロキシを実装することが重要です。

from lxml.html import parse

def parsepage(url):
if proxy:
    proxy_support = urllib2.ProxyHandler({"http":proxy})
    opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
    urllib2.install_opener(opener)
    conn = urllib2.urlopen(url)
    site = parse(conn).getroot()
else:
    site = parse(url).getroot()
return site

HTML 要素を返した後、次のような Xpath 式を使用してオブジェクトからデータを取得します。

element = site.xpath(expression)

問題は、エスケープ文字を含む非 Unicode データが結果に含まれることです。例えば:

\xe1ci\xf3s コンビ

私もこの実装を試しましたが、これは私にエラーを与えます:

def parsepage(url):
if proxy:
    proxy_support = urllib2.ProxyHandler({"http":proxy})
    opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
    urllib2.install_opener(opener)
    conn = urllib2.urlopen(url)
    rawdata = conn.read()
    parser = etree.HTMLParser(encoding="utf-8")
    site = etree.HTML(rawdata, parser=parser)
else:
    site = parse(url).getroot()
return site

エラーメッセージは次のとおりです。

'utf8' デコードは位置 4 のバイト 0xf3 をデコードできません: 無効な継続バイト

このサイトは iso-8859-2 文字セットを使用しています。

上記の解析方法のいずれかを使用して、非ユニコード文字をユニコードに変換する方法はありますか? または、何かが間違っていて、データを正しい形式で取得しているのに、表現に問題があるのか​​もしれません。

代わりに lxml.fromstring を使用し、encoding パラメータを使用する必要がありますか?

ありがとう、g0m3z

解決:

実際、私のコードには問題はありませんでしたが、データの表現には問題がありました。最初のコードの実装は正常に機能します。

結果を辞書にロードし、辞書全体を一度に印刷すると、Unicode 文字が正しく表示されません。ただし、キーに基づいて結果辞書の 1 つの項目のみを出力すると、Unicode 文字が正しく表されます。だからうまくいく!面白い。このスレッドで貴重なコメントをくださった皆様、ありがとうございます。

4

2 に答える 2

0

リクエストの解析にライブラリを使用することができます。BeautifulSoupをお勧めします。これにより、エンコードに関するすべての問題が処理され、非常に使いやすくなります。

于 2013-11-12T14:07:26.573 に答える
0

HTTP ヘッダー (または HTML メタタグ) から実際の文字エンコーディングを読み取る必要があり、推測しないでください。これにより、デコード エラーを回避できます。

于 2013-11-12T13:56:50.250 に答える