2009-03-04 38 views
12

Tôi có HTML sau:Nokogiri (RubyGem): Tìm kiếm và thay thế các thẻ HTML

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

... và bằng RubyGem Nokogiri (một sự thay thế hpricot), tôi muốn thay đổi nó vào trong theo 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> 

Nói cách khác: Làm cách nào để tìm và thay thế một số thẻ HTML nhất định bằng cách sử dụng Nokogiri? Tôi biết làm thế nào để tìm thấy chúng (bằng cách sử dụng từ khóa css), nhưng tôi không biết làm thế nào để thay thế chúng trong khi phân tích cú pháp tài liệu.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

18

Hãy thử điều này:

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

Giải pháp này thực sự thanh lịch! Cảm ơn rất nhiều! – Javier

+0

Bạn có biết cách thực hiện tìm kiếm css để tìm một div có id và một lớp không? Ví dụ:

XXX
? – Javier

+0

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

15

Có vẻ như các công trình này phải:

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

Giải pháp này cũng hoạt động. – 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

Giải pháp này hoạt động. – Javier

Các vấn đề liên quan