>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
誰かがこれに対する回避策を知っていますか?lxmlは、「より小さい」文字を含むテキストを切り捨てます。
>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
誰かがこれに対する回避策を知っていますか?lxmlは、「より小さい」文字を含むテキストを切り捨てます。
HTML入力が壊れています。 <
左角括弧は<
にエンコードされているはずです。 lxml
documentationから壊れたHTMLの解析:
壊れたHTMLを解析するサポートは、完全にlibxml2の回復アルゴリズムに依存します。パーザがそれらを処理できないほど大きく壊れている文書を見つけたら、lxmlの誤りではありません。結果のツリーに元の文書のすべてのデータが含まれるという保証はありません。構文解析を続行するのに苦労した場合、パーサーは重大な壊れた部分を削除する必要があります。特に誤った配置のメタタグがこの問題を抱えてエンコードの問題を引き起こす可能性があります。
他の言葉で言えば、このようなドキュメントから得ることができます。lxml
は、壊れたHTMLを処理する方法は他には設定できません。
1つのこと別の HTMLパーサーを使用してみてください。代わりにBeautifulSoupを試してみてください。壊れているHTML処理により、必要なものを提供する別のバージョンのドキュメントを提供できる場合があります。 BeautifulSoupは、lxml
とhtml5lib
を含むさまざまなパーサーバックエンドを再利用できるので、柔軟性が向上します。これは壊れたhtmlですが、それはlxmlのは優雅にそれを扱うことができないことを残念だ
>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> < 20 </div></body></html>
ugh、しばらくの間、多くのHTMLのものをやっていない、 '<'の末尾にセミコロンを忘れてしまった。 – Volatility
あなたの答えは素晴らしいです。 html5libでBSを使用することに関するあなたの提案は、この問題を解決します。ありがとうございました。 downvoteの人のために - 私は彼らが問題を理解していないと思う。 – Viacheslav
すでに 'lxml'を使用しているので、w3cの推奨する構文解析方法に従う[html5parser](http://lxml.de/html5parser.html)があることを指摘する価値があります(理論的にはブラウザが使用するものです)。 – mlissner
<
は実際に<
である必要があります.<
は、htmlの '予約された文字'のようなものです。そうすればうまくいくはずです。
ありがとうございますが、私はそれを明示的に '<'で動作させる必要があります – Viacheslav
あなたが望むものは特に興味がありません。あなたのマークアップは整形式ではありません。 XMLパーサはゴミ箱のマークアップを修正する必要はありません。あなたのマークアップを最初に修正してください* –
あなたのネガティブトーンは無関係です。私は3番目の部分のHTMLページを掻き集めており、それをそのまま解析する必要があります。私が与えた例は、この問題を示すことだけです。 – Viacheslav
:
html5lib
パーサはあなたに(<
エスケープに変換)<
文字を与えません。このタイプのhtmlは野生で非常に一般的です。 – speedplane