正規表現または文字列解析を使用しないでください。頭が痛くなるだけです。パーサーを使用します。
Ruby では Nokogiri を使用します。
require 'nokogiri'
html = '
<html>
<body>
<nav>...</nav>
<section>...</section>
</body>
</html>
'
doc = Nokogiri::HTML(html)
nav = doc.at('nav').content = "this is a new block"
puts doc.to_html
どの出力:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<nav>this is a new block</nav><section>...</section>
</body></html>
"this is a new block"
もちろん、次のようなものに置き換えたいと思うでしょうFile.read('snippet.html')
。
置換ファイルにnav
コンテンツではなく HTML スニペットが含まれている場合は、代わりにこれを使用します。
nav = doc.at('nav').replace('<nav>this is a new block</nav>')
出力は同じになります。(そして、繰り返しになりFile.read
ますが、それがあなたのやり方である場合は、ファイルからそれを取得するために使用します。)
Nokogiri ではat
、CSS または XPath アクセサーによって指定されたタグの最初のインスタンスを見つけて、ノードを返します。上記のCSSを使用しました//nav
が、うまくいきました。at
アクセサーのタイプを推測します。あいまいなアクセサーを持つ可能性があるため、特定したい場合はat_css
orを使用できます。at_xpath
また、search
Nokogiri には、配列のように機能する NodeSet を返す があります。必要なことを実行して、結果を反復処理できます。また、 のようat
に、CSS と XPath 固有のバージョンがそれぞれcss
ありxpath
ます。
Nokogiri には CLI インターフェースがあり、この例のような単純なものであれば機能しますが、sed または Ruby/Perl/Python ワンライナーでも実行できます。
curl -s http://nokogiri.org | nokogiri -e'p $_.css("h1").length'
ただし、HTML がこれほど単純であることはめったになく、特に徘徊していることが判明したものはすべて、CLI やワンライナー ソリューションは急速に制御不能になるか、単に機能しなくなります。何年にもわたって多くのスパイダーや RSS アグリゲーターを書いてきたことに基づいていると言えます。最初は単純なものでも、追加の HTML や XML ソースを導入すると、より複雑になり、決して簡単になることはありません。パーサーを使用することで、最初にパーサーに行くことを学びました。