問題タブ [html5lib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
beautifulsoup - BeautifulSoup html5lib の解析で奇妙な現象が発生..それはバグですか?
python2.6 + htmllib0.99 + bs4
次のコードを実行すると、例外がスローされます
"<title>" と "test" の間のスペースを削除すると、プログラムは正常に実行されます
python - html5lib を使用して HTML を XML に解析する
HTML ページを整理して、Python で XML に変換する必要があります。必要に応じて、いくつかの「悪い」部分を失います。
TagSoupは以前から使用していましたが、新しい「記事」、「フッター」タグが理解できず、頭にない「メタ」が気に入らない。結果の XML を処理することがほとんど不可能になります。
これまでのところhtml5lib の機能は気に入っていますが、5 回目のテスト (非常に奇妙なテスト) は失敗しました。解析時
html5lib + xml.dom treebuilder を使用して、結果の XML 文字列で次のようになりました。
これは整形式の xml では良い結果ではありません。
ツリービルダーとしてhtml5lib + lxmlを試したところ、
これは優れていますが、問題はlxmlがタグの終了タグ/スラッシュを「食べる」ことであり、 XMLを出力するときに<link>
それらを作成します。<link ... >
何を使用することをお勧めしますか?
python - Python で HTML を解析するときに位置情報を取得する
Python で (不正な形式の可能性がある) HTML を解析し、一連の条件が満たされた場合、ドキュメントのその部分を位置 (行、列) で出力する方法を見つけようとしています。ここで私をつまずかせているのは位置情報です。明確にするために、オブジェクト ツリーを構築する必要はありません。元のドキュメント内の特定のデータとその位置を見つけたいだけです (スペル チェッカーを考えてみてください。たとえば、「x 行、y 列の単語 "foo" のスペルが間違っています)」
例として、( ElementTree のTarget APIを使用して) 次のようなものが必要です。
ただし、私が知る限り、そのgetpos()
方法 (またはそのようなもの) は存在しません。そしてもちろん、それは XML パーサーを使用しています。不正な可能性のある HTML を解析したい。
興味深いことに、Python 標準ライブラリのHTMLParserクラスは (メソッドを使用して) 位置情報を取得するためのサポートを提供しますgetpos()
が、不正な形式の HTML を処理するのは恐ろしく、可能な解決策として削除されました。パーサーを壊すことなく、実際の単語に存在する HTML を解析する必要があります。
私は、不正な形式の HTML の解析に適した 2 つの HTML パーサー、つまりlxmlとhtml5libを認識しています。実際、Python で利用可能な他のオプションよりも、どちらかを使用することをお勧めします。
ただし、私が知る限り、html5lib はイベント API を提供しておらず、ドキュメントをツリー オブジェクトに解析する必要があります。次に、ツリーを反復処理する必要があります。もちろん、その時点までに、ソース ドキュメントとの関連付けはなく、すべての位置情報が失われます。そのため、html5lib がリリースされました。これは、不正な HTML を処理するのに最適なパーサーのように思われるため、残念です。
lxml ライブラリは、ElementTree のものをほぼミラーリングした Target API を提供しますが、ここでも、各イベントの位置情報にアクセスする方法を知りません。ソースコードを一瞥してもヒントはありませんでした。
lxml は、SAX イベントへの API も提供します。興味深いことに、Python の標準 lib は、SAX がLocator Objectsをサポートしていると述べていますが、それらの使用方法に関するドキュメントはほとんど提供していません。This SO Questionは (SAX パーサーを使用する場合) いくつかの情報を提供しますが、lxml が提供する SAX イベントの限定的なサポートにどのように関連するのかわかりません。
最後に、誰かがBeautiful Soupを提案する前に、ホームページに記載されているように、「Beautiful Soup は、lxml や html5lib などの一般的な Python パーサーの上にある」ことを指摘しておきます。それが私に与えるのは、元のソース文書に接続されていないデータを抽出するためのオブジェクトだけです。html5lib と同様に、データにアクセスできるようになるまでにすべての位置情報が失われます。パーサーに直接アクセスしたい/必要です。
冒頭で述べたスペル チェッカーの例を拡張すると、ドキュメント テキスト内の単語のスペルのみをチェックし (タグ名や属性はチェックしない)、特定のタグ (スクリプトなど) の内容のチェックをスキップしたい場合があります。またはコードタグ)。したがって、実際の HTML パーサーが必要です。ただし、スペル ミスの単語の報告に関しては、元のソース ドキュメント内のスペル ミスの単語の位置にのみ関心があり、ツリー オブジェクトを作成する必要はありません。明確にするために、これは潜在的な用途の 1 つの例にすぎません。私はそれをまったく別のものに使用するかもしれませんが、ニーズは本質的に同じです. 実際、HTMLParser を使用して非常によく似たものを作成したことがありますが、そのユース ケースではエラー処理が機能しないため、使用したことはありません。それは何年も前のことで、途中でそのファイルを失ったようです。今回は代わりに lxml または html5lib を使用したいと思います。
それで、私が見逃しているものはありますか?これらのパーサーのどれも (ほとんど役に立たない HTMLParser を除いて) 位置情報にアクセスする方法を持っていないとは信じがたいです。しかし、もしそうなら、それは文書化されていないに違いありません。これは私には奇妙に思えます。
python - html5lib は悪意のある入力に対して脆弱ですか?
Python のXML Processing Modulesドキュメントには、XML 処理モジュールの脆弱性がリストされています。html5lib は HTML5 仕様 (未知のバグは別として) に従っているため、悪意のある入力に対して同様に脆弱ではないと思いますが、私は仮定を立てるのが嫌いで、潜在的なセキュリティ問題についての議論を見つけることができません。
知っておくべきセキュリティ上の問題はありますか? それとも、悪意を持って作成された html を解析するために使用しても安全ですか?
python - ページpythonのHtml5検索/解析特定要素
データベースで使用する html5 Web ページからデータを検索/解析する方法を学ぼうとしています。これの最初だけからデータを検索/解析する方法を学びたい'//div[@class="col-xs-12 col-sm-6 col-md-4 col-lg-3"]'
lxml import html および xpath から html5lib を試しましたが、特定の用途に関するドキュメントがないことにイライラし、これを達成する方法を実際に見つけることができませんでした。
検索して保存するデータ:
私が学ぼうとしているhtmlコード
html - lxml html5parser は「namespaceHTMLElements=False」オプションを無視します
lxml html5parserは、namespaceHTMLElements=False
渡したオプションを無視するようです。私が与えたすべての要素を、(予想される) void 名前空間ではなく、HTML 名前空間に入れます。
問題を再現する簡単なケースを次に示します。
その出力は次のとおりです。
ご覧のとおり、html
要素とそこにある他のすべての要素は、HTML 名前空間にあります。
予想される出力は、代わりに次のようになります。
これnamespaceHTMLElements
は html5lib オプションであり、lxml が直接処理するネイティブの lxml オプションではありません。lxml は、html5lib を呼び出して、そのオプションを html5lib に渡して、html5lib が期待どおりに使用できるようにすることになっています。
2016-02-17 更新
lxml html5parser を取得して を尊重する方法をまだ見つけていませんnamespaceHTMLElements
。しかし、明確にするために、代わりに次のように html5lib を直接呼び出すこともできます。
詳細
私がすでに知っているいくつかのこと:
- html5lib は、要素を HTML 名前空間に配置する必要があるという要件を
html
含め、HTML 仕様の要件に完全に準拠しています— html5lib はこれを行います - ただし、html5lib は、デフォルトの「要素を HTML 名前空間に
namespaceHTMLElements=False
配置する」動作をオーバーライドするオプションを提供します。html
- html5lib を (lxml ではなく) 直接使用してそれに渡す
namespaceHTMLElements=False
と、すべてが期待どおりに機能しhtml
ます。要素は void 名前空間に入ります。 いくつかのprintfをhtml5libソースにハッキングすると、次のことがわかります。
- lxmlは実際に
namespaceHTMLElements=False
期待どおりに html5lib を呼び出しています - しかし、lxml は html5lib を 2 回呼び出しているようです。
namespaceHTMLElements
namespaceHTMLElements=False
- lxmlは実際に
原因がどこにあるのかについての結論
上記のことから、lxml と html5lib の間のインターフェースに問題があることは明らかです。lxml が html5lib を 2 回呼び出している理由はわかりませんが、何らかの理由で、XHTMLParser
実際に要求していることを実行する前に、最初に独自の新しいインスタンスを作成しようとするためだと思います。独自のインスタンスHTMLParser
。
したがって、html5lib に対して 2 つの呼び出しを行うという事実により、html5lib は、最初の呼び出しの結果のデフォルトの動作を一種の「ロックイン」し、2 回目の呼び出しで検出されたディレクティブnamespaceHTMLElements=True
を無視するようになる可能性があります。namespaceHTMLElements=False
おそらく、そのように 2 つの呼び出しを行うことで、lxml は html5lib のいくつかの仮定を破っているか、実際には html5lib API を設計上意図されていない方法で誤用しています。
あるいは、原因は lxml が html5lib に対して 2 つの別々の呼び出しを行った結果ではなく、html5lib インターフェイスの使用方法に別の問題がある可能性があります。
とにかく、他の誰かがこの問題に遭遇して回避策を持っているかどうか、または少なくともなぜそれが起こっているのかについての洞察を持っているかどうかについて、他の人から聞くことに興味があります.
lxml - lxml _Element を HtmlElement に変換する
さまざまな理由から、 から に切り替えようとしlxml.html.fromstring()
ていlxml.html.html5parser.document_fromstring()
ます。2 つの大きな違いは、1 つ目は を返し、2 つ目は をlxml.html.HtmlElement
返すことlxml.etree._Element
です。
ほとんどの場合、これで問題ありませんが、_Element
オブジェクトを使用してコードを実行しようとすると、次のようにクラッシュします。
これは理にかなっています。私の質問は、この問題に対処する最善の方法は何かということです。HtmlElements を期待するコードがたくさんあるので、それらに変換するのが最善の解決策だと思います。それが可能かどうかはわかりませんが。
アップデート
1 つのひどい解決策は次のようになります。
明らかに、それはかなり力ずくですが、うまくいきます。html5parser によって解析された HtmlElement を取得できます。これが私が求めているものです。
もう 1 つのオプションは、私が依存している rewrite_links と xpath クエリを実行する方法を考え出すことですが、_Element
s にはその機能がないようです (これもまた理にかなっています!)。