5
>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'

誰かがこれの回避策を知っていますか?

4

2 に答える 2

14

HTML入力が壊れています。その<左山かっこは、&lt;代わりににエンコードされている必要があります。壊れたHTMLの解析lxmlに関するドキュメントから:

壊れたHTMLの解析のサポートは、libxml2の回復アルゴリズムに完全に依存しています。パーサーがそれらを処理できないほどひどく壊れているドキュメントを見つけた場合、それはlxmlのせいではありません。また、結果のツリーに元のドキュメントのすべてのデータが含まれるという保証もありません。解析を続けるのに苦労しているとき、パーサーはひどく壊れた部品を落とさなければならないかもしれません。特に置き忘れたメタタグはこれに悩まされる可能性があり、エンコーディングの問題につながる可能性があります。

言い換えれば、あなたはそのようなドキュメントから得ることができるものを取ります、lxml壊れたHTMLを処理する方法は他の方法では構成できません。

試すことができることの1つは、別のHTMLパーサーを使用することです。代わりにBeautifulSoupを試してみてください。壊れたHTML処理により、そのドキュメントの別のバージョンが提供され、必要なものが提供される可能性があります。lxmlBeautifulSoupは、とを含むさまざまなパーサーバックエンドを再利用できるhtml5libため、柔軟性が向上します。

html5libパーサーはあなたにキャラクターを与えます(エスケープ<に変換されます):&lt;

>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> &lt; 20 </div></body></html>
于 2013-01-05T11:43:54.880 に答える
2

htmlの「予約文字」のようなものなので、<実際にはである必要があります。その後、それは動作するはずです。&lt;<

于 2013-01-05T10:54:43.510 に答える