1

Python Requestsモジュールを使用してリモートページをフェッチし、DOMツリーを再構築し、いくつかの処理を実行して、結果をファイルに保存しようとしています。ページをフェッチしてファイルに書き込むだけで、すべてが機能します(後でブラウザーでhtmlファイルを開くことができ、正しくレンダリングされます)。

ただし、pyqueryオブジェクトを作成して処理を行い、str変換を使用して保存すると、失敗します。具体的には、&&などの特殊文字が保存されたソースのスクリプトタグ内で変更され(pyqueryの適用によって引き起こされます)、ページが正しくレンダリングされなくなります。

これが私のコードです:

import requests
from lxml import etree
from pyquery import PyQuery as pq

user_agent = {'User-agent': 'Mozilla/5.0'}
r = requests.get('http://www.google.com',headers=user_agent, timeout=4)

DOM = pq(r.text)
#some optional processing
fTest = open("fTest.html","wb")
fTest.write(str(DOM))
fTest.close()

したがって、問題は、pyqueryの適用後に特殊文字がエスケープされないようにする方法です。lxml(pyqueryの親ライブラリ)に関連している可能性があると思いますが、オンラインでの面倒な検索とオブジェクトのシリアル化のさまざまな方法の実験の後、私はまだそれを作成しませんでした。多分これはUnicode処理にも関係していますか?!

よろしくお願いします!

4

1 に答える 1

3

この問題に対する洗練された解決策と、コードが以前に機能しなかった理由を見つけました。

まず、 http://lxml.de/lxmlhtml.htmlでページを注意深く読むことができます。「E-factory で HTML を作成する」セクションがあります。etree.tostring() methodこのセクションの後で、彼らは XML でのみ機能するという事実を指摘しています。しかし、スクリプトやスタイルタグを持つ可能性が追加された HTML の場合、混乱が生じます。だから..第二に、解決策はオーバーロードされたメソッドを使用することhtml.tostring()です。

最終的な作業コードは次のとおりです。

# for networking
import requests
# for parsing and serialization
from lxml import etree
from lxml.html import tostring as html2str # IMPORTANT!!!
from pyquery import PyQuery as pq

user_agent = {'User-agent': 'Mozilla/5.0'}
r = requests.get('http://www.google.com',headers=user_agent, timeout=4)

# construct DOM object
DOM = pq(r.text)
# do stuff with DOM
#
# save result to file
fTest = open("fTest.html","wb")
fTest.write(html2str(DOM.root)) # IMPORTANT!!!
fTest.close()

将来的に時間を節約できることを願っています!みんな楽しんでね!;)

于 2012-11-18T21:16:34.220 に答える