Nokogiri は、不正な形式の HTML を解析可能にするために修正しています。終了後、DOM は適切な状態になりますが、元のドキュメントは Nokogiri から入手できなくなります。
オリジナルを変更しない場合は、Nokogiri に渡す前に有効にする必要があります。その後、Nokogiri のメソッドを使用して操作できます。通常、正規表現を使用して問題のある場所を見つけ、タグまたは関連する終了タグを追加/調整して、Nokogiri が問題を修正することなく解析できるようにします。
errors
これは、HTML が XML よりも優れているということではありません。厳格な XML 仕様の精神を尊重し、ファイルが無効な場合に配列にエラーを入力してフラグを立てる Nokogiri の事例です。HTML の仕様はそれほど厳格ではありません。ブラウザーは HTML を解析して表示する際に (あまりにも) 寛容であるため、Nokogiri はある程度それに従い、修正を行い、errors
配列に値を入力します。(どちらの場合でも、その配列をチェックして何が問題なのかを確認できます。)
require 'nokogiri'
orig_html = '
<html>
<meta name="Generator" content="Microsoft Word 97 O.o">
<body>
1
<b><p>2</p></b>
3
</body>
</html>'
doc = Nokogiri::HTML(orig_html)
doc.errors
doc.errors
内容:
[
[0] #<Nokogiri::XML::SyntaxError: Unexpected end tag : b>
]
Nokogiri を使用してサンプル HTML を修正する方法は次のとおりです。
doc = Nokogiri::HTML(orig_html)
p = doc.at('b+p')
p.previous_sibling.remove
この時点での HTML は次のとおりです。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 97 O.o">
</head>
<body>
1
<p>2</p>
3
</body>
</html>
続き:
p.inner_html = "<b>#{p.content}</b>"
puts doc.to_html
結果の HTML は次のとおりです。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 97 O.o">
</head>
<body>
1
<p><b>2</b></p>
3
</body>
</html>
サンプル HTML が実際に作業しているものではないことは明らかなので、変更が必要なタグを見つけるためにアクセサーを変更する必要がありますが、それでうまくいくはずです。