16

nokogiriでhtmlページをスクレイピングしていて、すべてのスタイル属性を削除したいと思います。
どうすればこれを達成できますか?(私はレールを使用していないので、サニタイズ方法を使用できません。また、サニタイズジェムを使用したくないので、ホワイトリストではなくブラックリストから削除します)

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>
4

3 に答える 3

19
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)

Documentの代わりにDocumentFragmentを使用している場合、Nokogiriには長年のバグがあり、フラグメントからの検索が期待どおりに機能しないことに注意してください。回避策は次のとおりです。

doc.xpath('@style|.//@style').remove
于 2011-05-23T22:26:25.823 に答える
8

これは、ドキュメントとドキュメントフラグメントの両方で機能します。

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

また

doc = Nokogiri::HTML(...)

すべての「スタイル」属性を削除するには、次のようにします。

doc.css('*').remove_attr('style')
于 2014-10-08T01:50:24.640 に答える
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
于 2012-07-11T10:03:26.127 に答える