Nokogiri имеет два различных режима синтаксического анализатора, один для XML и один для HTML.XML строг, а HTML очень расслаблен, потому что HTML не всегда хорошо себя ведет.
doc = Nokogiri::XML('<xml><a>1</a></xml>')
или
doc = Nokogiri::HTML('<html><body>foo</body></html>')
Так я обычно разбираю HTMLfile :
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.example.com'))
print doc.to_html
# >> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
[...]
Чтобы удалить тег, сначала нужно найти его, а затем remove
.После того, как мы проанализируем документ HTML или XML, у нас будет документ Nokogiri :: HTML или Nokogiri :: XML соответственно, и в этот момент то, что мы назвали «тегами», теперь называется «узлами».Nokogiri может найти наборы узлов, которые являются узлами, которые соответствуют запросу, или отдельный узел, который будет первым совпадением в результате поиска.
Это будет искать первый узел, соответствующий src="a.png"
, используя CSS-аксессор, который обычно проще / чище, чем XPath.Nokogiri очень хорошо понимает и XPath, и CSS, и есть несколько преимуществ CSS, упомянутых на сайте:
require 'nokogiri'
require 'open-uri'
html = '<html><body><img src="a.png" /><img src="b.png" /></body></html>'
doc = Nokogiri::HTML(html)
doc.at('img[@src="a.png"]').remove
print doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body><img src="b.png"></body></html>
Чтобы найти все узлы, соответствующие аксессору, вы можете заменить doc.at('img[@src="a.png"]').remove
на:
doc.search('img[@src="a.png"]').each { |n| n.remove }
Учебники тоже стоит прочитать.