Вопрос по sanitize, html –  ты должен использовать

15

ираю html-страницу с помощью nokogiri и хочу удалить все атрибуты стиля.
Как мне этого добиться? (Я не использую рельсы, поэтому я не могу использовать его метод sanitize, и я не хочу использовать geit sanitize, потому что я хочу удалить черный список, а не белый)

html = open(url)
doc = Nokogiri::HTML(html.read)
doc.css('.post').each do |post|
puts post.to_s
end

=> <p><span style="font-size: x-large">bla bla <a href="http://torrentfreak.com/netflix-is-killing-bittorrent-in-the-us-110427/">statistica</a> blabla</span></p>

Я хочу чтобы это было

=> <p><span>bla bla <a href="http://torrentfreak.com/netflix-is-killing-bittorrent-in-the-us-110427/">statistica</a> blabla</span></p>

Ваш Ответ

3   ответа
17
require 'nokogiri'

html = '<p class="post"><span style="font-size: x-large">bla bla</span></p>'
doc = Nokogiri::HTML(html)
doc.xpath('//@style').remove
puts doc.css('.post')
#=> <p class="post"><span>bla bla</span></p>

Отредактировано, чтобы показать, что вы можете просто позвонитьNodeSet#remove вместо того, чтобы использовать.each(&:remove).

Обратите внимание, что если у вас есть DocumentFragment вместо Document, Nokogiri имеетдавняя ошибка где поиск по фрагменту не работает так, как вы ожидаете. Обходной путь должен использовать:

doc.xpath('@style|.//@style').remove
использованиеdoc.xpath('.//@style').remove чтобы удалить все встроенные стили из всех узлов, обратите внимание на. в начале, как упомянуто @bricker ниже. цепь.to_s чтобы получить результирующую строку HTML. Gon Zifroni
Исправление: не цепляйте это, но используйтеdescription.to_s чтобы получить результирующую строку HTML. Если вы не хотитеDOCTYPE Вы должны использоватьNokogiri::HTML.fragment вместо этого, см.stackoverflow.com/questions/4723344/... Gon Zifroni
Ух ты. это просто! я люблю это. Спасибо! keepitterron
3

но не смог заставить его работать (хотя я использовал фрагмент документа, но я думал, что он должен работать так же?).

«//» в начале, казалось, не проверял все узлы, как я ожидал. В конце концов, я сделал что-то более длинное, но это сработало, так что здесь для справки, на случай, если у кого-то еще возникнет такая же проблема, это мое решение (хотя оно и грязное):

doc = Nokogiri::HTML::Document.new
body_dom = doc.fragment( my_html )

# strip out any attributes we don't want
body_dom.xpath( './/*[@align]|*[@align]' ).each do |tag|
    tag.attributes["align"].remove
end
Nokogiri и / или LibXML2 имеютошибка с XPath внутри фрагментов, Текущий лучший обходной путь для фрагментов, как вы заметили: вместо//foo ты должен использоватьfoo|.//foo. Phrogz
Это также, вероятно, сработает:body_dom.xpath('.//@class') (обратите внимание на дополнительную точку в начале xpath) bricker
8

doc = Nokogiri::HTML::DocumentFragment.parse(...)

или же

doc = Nokogiri::HTML(...)

Чтобы удалить все атрибуты 'style', вы можете сделать

doc.css('*').remove_attr('style')

Похожие вопросы