Атрибутировать стилевые атрибуты с нокогири
Я соскребаю 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
ура
Пит