Как удалить узел с помощью Nokogiri?

Как удалить теги <img> с помощью Nokogiri?

У меня есть следующий код, но он не работает:

# str = '<img src="canadascapital.gc.ca/data/2/rec_imgs/5005_Pepsi_H1NB.gif"/…; testt<a href="#">test</a>tfbu' 

f = Nokogiri::XML.fragment(str)
f.search('//img').each do |node| 
  node.remove
end
puts f

person all jazz    schedule 10.11.2009    source источник
comment
Можете ли вы опубликовать образец значения для str?   -  person Andy Gaskell    schedule 10.11.2009
comment
str = '‹img src=canadascapital.gc.ca/data/ 2/rec_imgs/5005_Pepsi_H1NB.gif› testt‹a href=#›test‹/a›tfbu'   -  person all jazz    schedule 11.11.2009
comment
добавил это к вопросу .. в следующий раз просто отредактируйте вопрос, чтобы добавить запрашиваемую информацию, намного проще, чем собирать материал из вопроса и комментариев.   -  person Chuck van der Linden    schedule 25.04.2012
comment
Мне нужно было удалить все скрипты на странице $page_html = Nokogiri::HTML.parse($browser.html) ; $page_html.search('//script').each{|x| х.удалить} ; # работал как шарм. ты   -  person Duck1337    schedule 09.07.2015


Ответы (2)


попробуй!

f = Nokogiri::XML.fragment(str)

f.search('.//img').remove
puts f
person xds2000    schedule 12.11.2009

Я предпочитаю CSS, а не XPath, так как он обычно более удобочитаем. Переключение на CSS:

require 'nokogiri'

doc = Nokogiri::HTML('<html><body><img src="foo"><img src="bar"></body></html>')

После разбора документ выглядит так:

doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<img src=\"foo\"><img src=\"bar\">\n</body></html>\n"

Удаление тегов <img>:

doc.search('img').each do |src|
  src.remove
end

Результат:

doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body></body></html>\n"
person the Tin Man    schedule 29.09.2013
comment
Поскольку ваш блок просто вызывает метод для каждой итерации, если вы хотите быть модным, вы можете сделать символ для proc: doc.search('img').each(&:remove). - person Tyler James Young; 16.04.2020
comment
Да, но тогда, в 2013 году, у нас не было такой фантастической возможности. - person the Tin Man; 16.04.2020
comment
Я из будущего! :) Спасибо за этот ответ. Этот и другие ваши очень помогли мне, поскольку я делаю сценарии Ruby для изменения больших пакетов HTML-файлов и автоматизации своей (черной части моей) работы. - person Tyler James Young; 17.04.2020
comment
Приятно знать, что ответы помогают; В этом весь смысл SO, обучения и передачи того, чему мы научились. - person the Tin Man; 18.04.2020