Nokogiri имеет два разных режима парсера: один для XML и один для HTML. XML строг, а HTML очень расслаблен, потому что HTML не всегда хорошо себя ведет.
doc = Nokogiri::XML('<xml><a>1</a></xml>')
or
doc = Nokogiri::HTML('<html><body>foo</body></html>')
Вот как я обычно анализирую файл HTML:
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 }
Также стоит прочитать руководства.
person
the Tin Man
schedule
05.12.2010