Атрибуты стиля полосы с nokogiri

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

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="#" onclick="location.href='http://torrentfreak.com/netflix-is-killing-bittorrent-in-the-us-110427/'; return false;">statistica</a> blabla</span></p>

Я хочу, чтобы он был

=> <p><span>bla bla <a href="#" onclick="location.href='http://torrentfreak.com/netflix-is-killing-bittorrent-in-the-us-110427/'; return false;">statistica</a> blabla</span></p>

Ответы

Ответ 1

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 вместо документа, Nokogiri имеет давнюю ошибку, где поиск из фрагмента не работает так, как вы бы ожидать. Обходной путь заключается в использовании:

doc.xpath('@style|.//@style').remove

Ответ 2

Это работает как с документом, так и с фрагментом документа:

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

или

doc = Nokogiri::HTML(...)

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

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

Ответ 3

Я попробовал ответ от 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

Приветствия

Пит