2009-03-04 9 views
12

私は次のHTMLを持っています:Nokogiri(RubyGem):HTMLタグの検索と置換

<html> 
<body> 
<h1>Foo</h1> 
<p>The quick brown fox.</p> 
<h1>Bar</h1> 
<p>Jumps over the lazy dog.</p> 
</body> 
</html> 

...そしてRubyGem Nokogirihpricot置換え)を使って、次のようにHTMLに変更したいと思います:

<html> 
<body> 
<p class="title">Foo</p> 
<p>The quick brown fox.</p> 
<p class="title">Bar</p> 
<p>Jumps over the lazy dog.</p> 
</body> 
</html> 

つまり、Nokogiriを使用して特定のHTMLタグを見つけて置き換えるにはどうすればよいですか?私はそれらを(CSSのキーワードを使用して)見つける方法を知っていますが、ドキュメントの解析中にそれらを置き換える方法はわかりません。

あなたのお手伝いをありがとう!

答えて

18

これを試してみてください:

require 'nokogiri' 

html_text = "<html><body><h1>Foo</h1><p>The quick brown fox.</p><h1>Bar</h1><p>Jumps over the lazy dog.</p></body></html>" 

frag = Nokogiri::HTML(html_text) 
frag.xpath("//h1").each { |div| div.name= "p"; div.set_attribute("class" , "title") } 
+0

このソリューションは、本当にエレガントです!どうもありがとう! – Javier

+0

IDとクラスを持つdivを見つけるためのCSS検索を行う方法を知っていますか?例:

XXX
? – Javier

+0

frag.xpath( "// div [@ id = 'foo'と@ class = 'bar']") – SimonV

15

はそう、これが正しく動作するように:

require 'rubygems' 
require 'nokogiri' 

markup = Nokogiri::HTML.parse(<<-somehtml) 
<html> 
<body> 
<h1>Foo</h1> 
<p>The quick brown fox.</p> 
<h1>Bar</h1> 
<p>Jumps over the lazy dog.</p> 
</body> 
</html> 
somehtml 

markup.css('h1').each do |el| 
    el.name = 'p' 
    el.set_attribute('class','title') 
end 

puts markup.to_html 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body> 
# >> <p class="title">Foo</p> 
# >> <p>The quick brown fox.</p> 
# >> <p class="title">Bar</p> 
# >> <p>Jumps over the lazy dog.</p> 
# >> </body></html> 
+0

この解決策も機能します。 – Javier

6
#!/usr/bin/env ruby 
require 'rubygems' 
gem 'nokogiri', '~> 1.2.1' 
require 'nokogiri' 

doc = Nokogiri::HTML.parse <<-HERE 
    <html> 
    <body> 
     <h1>Foo</h1> 
     <p>The quick brown fox.</p> 
     <h1>Bar</h1> 
     <p>Jumps over the lazy dog.</p> 
    </body> 
    </html> 
HERE 

doc.search('h1').each do |heading| 
    heading.name = 'p' 
    heading['class'] = 'title' 
end 

puts doc.to_html 
+0

このソリューションは機能します。 – Javier