Как мне удалить узел изображения с данным атрибутом src? - PullRequest
1 голос
/ 05 декабря 2010

Мне нужно удалить изображение с предоставлением src

img_src = "http://domain/img.jpg"
@doc.xpath("//img[@src='#{img_src}']")[0].remove

Не работает.Пробовал тоже вот так

@doc.xpath("//img[@src='#{img_src}']") {|x| x.remove}

тоже не работает.Есть идеи, что я делаю не так?

Я понял.Это была глупая ошибка.Все ваши решения были правильными.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

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 }

Учебники тоже стоит прочитать.

1 голос
/ 05 декабря 2010

у меня работает:

require 'nokogiri'
xml = <<ENDXML
  <root>
    <img src="http://foo/foo.jpg" />
    <img src="http://bar/bar.jpg" />
  </root>
ENDXML

doc = Nokogiri::XML xml
img_src = "http://foo/foo.jpg"

doc.at_xpath("//img[@src='#{img_src}']").remove

puts doc
#=> <?xml version="1.0"?>
#=> <root>
#=> 
#=> <img src="http://bar/bar.jpg"/>
#=> </root>
...