1

tidy-ext gemを使用して、取得した HTML を整理しようとしています。ただし、HTML がかなり壊れていると失敗するため、最初に Nokogiri を使用して HTML を修復しようとしています。

repaired_html = Nokogiri::HTML.parse(a.raw_html).to_html

うまく機能しているように見えますが、最近、FBML マークアップを HTML ドキュメントに挿入したサンプルに遭遇しました<fb:like>。これは、無効であるにもかかわらず Nokogiri によって何らかの方法で保存されています。次に、TidyはError: <fb:like> is not recognized!どちらが理解できるかを言います。

strictや Nokogiri に有効な HTML タグのみを含め、他のすべてを省略させるようなオプションが他にあるのでしょうか?

4

1 に答える 1

0

Nokogiri の XML パーサーを使用して HTML を解析できます。これはデフォルトで厳密ですが、それでも修正が行われるため、HTML/XML はわずかに正しいため、少ししか役に立ちません。パーサーに渡すことができるフラグを調整することで、Nokogiri をさらに厳格にし、無効なドキュメントを返すことを拒否することができます。Nokogiri は、目的のタグのサニタイザーまたはホワイトリストではありません。その機能については、 LoofahSanitizeをご覧ください。

HTML コンテンツが という変数にある場合、次のhtmlようにします。

doc = Nokogiri::XML.parse(html)

その後、doc.errorsエラーがないかどうかを確認します。Nokogiri はそれらを修正しようとしますが、エラーを生成したものにはフラグが立てられます。

例えば:

Nokogiri::XML('<fb:like></fb:like>').errors
=> [#<Nokogiri::XML::SyntaxError: Namespace prefix fb on like is not defined>]

Nokogiri は HTML の修正を試みます。

Nokogiri::XML('<fb:like></fb:like>').to_xml
=> "<?xml version=\"1.0\"?>\n<like/>\n"

ただし、タグの不明な名前空間を削除するところまで修正するだけです。

これらのノードを取り除きたい場合:

doc = Nokogiri::XML('<fb:like></fb:like>')
doc.search('like').each{ |n| n.remove }
doc.to_xml => "<?xml version=\"1.0\"?>\n"
于 2012-07-19T09:22:00.660 に答える