Nokogiri (RubyGem): поиск и замена тегов HTML
У меня есть следующий 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 Nokogiri (a hpricot), я хотел бы изменить его на следующий 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>
Другими словами: Как я могу найти и заменить определенные теги HTML с помощью Nokogiri? Я знаю, как их найти (используя ключевые слова css), но я не знаю, как их заменить при разборе документа.
Спасибо за вашу помощь!
Ответы
Ответ 1
Попробуйте следующее:
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") }
Ответ 2
Похоже, это работает правильно:
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>
Ответ 3
#!/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