Удалить комментарии из inner_html - PullRequest
9 голосов
/ 24 октября 2011

У меня есть код, который использует Nokogiri, и я пытаюсь получить inner_html без комментариев.

html = Nokogiri::HTML(open(@sql_scripts_url[1])) #using first value of the array
html.css('td[class="ms-formbody"]').each do |node|
  puts node.inner_html # prints comments
end

1 Ответ

13 голосов
/ 26 октября 2011

Поскольку вы не предоставили образец HTML или желаемый вывод, вот общее решение:

Вы можете выбрать комментарии SGML в XPath с помощью теста узла comment(); Вы можете удалить их из документа, вызвав .remove на всех узлах комментариев. Иллюстрированный:

require 'nokogiri'
doc  = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>')
p doc.inner_html                        #=> "<b>hello</b> <!-- foo --> world"
doc.xpath('//comment()').remove
p doc.inner_html                        #=> "<b>hello</b>  world"

Обратите внимание, что вышеизложенное изменяет документ, чтобы удалить комментарии. Если вы хотите сохранить исходный документ без изменений, вы можете сделать следующее:

class Nokogiri::XML::Node
  def inner_html_reject(xpath='.//comment()')
    dup.tap{ |shadow| shadow.xpath(xpath).remove }.inner_html
  end
end

doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>')
p doc.inner_html_reject #=> "<r><b>hello</b>  world</r>"
p doc.inner_html        #=> "<r><b>hello</b> <!-- foo --> world</r>"

Наконец, обратите внимание, что если вам не нужна разметка, просто запрос самого text не включает комментарии HTML:

p doc.text              #=> "hello  world"
...