Атрибутика стилевых атрибутов с нокогири - PullRequest
15 голосов
/ 23 мая 2011

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

18 голосов
/ 24 мая 2011
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
8 голосов
/ 08 октября 2014

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

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

или

doc = Nokogiri::HTML(...)

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

doc.css('*').remove_attr('style')
3 голосов
/ 11 июля 2012

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