我正在用nokogiri抓取一个html页面,我想去掉所有的样式属性
我怎样才能做到这一点?(我不使用rails,所以我不能使用它的消毒方法,我不想使用消毒宝石,因为我想黑名单删除而不是白名单)
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>
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(...)
要删除所有"样式"属性,可以执行
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