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 文字が正しく表されます。だからうまくいく!面白い。このスレッドで貴重なコメントをくださった皆様、ありがとうございます。