Атрибутировать стилевые атрибуты с нокогири

Я соскребаю 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 ответа

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 = Nokogiri::HTML::DocumentFragment.parse(...)

или же

doc = Nokogiri::HTML(...)

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

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

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

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

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

ура

Пит

Другие вопросы по тегам