2011-05-23 14 views
14

मैं नोकोगिरी के साथ एक 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> 

उत्तर

15
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) का उपयोग करने की।

ध्यान दें कि यदि आपके पास दस्तावेज़ के बजाय दस्तावेज़ फ़्रेगमेंट है, तो नोकोगिरी में a longstanding bug है जहां एक टुकड़े से खोजना आपके काम की अपेक्षा नहीं करता है। तरीके का उपयोग करने के लिए है:

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

कर सकते हैं वाह। वह आसान है! मुझे यह पसंद है। धन्यवाद! – keepitterron

+0

'doc.xpath (' .//@ style ') का उपयोग करें। सभी नोड्स से सभी इनलाइन शैलियों को निकालने के लिए हटाएं, शुरुआत में '.' को नोट करें जैसा कि नीचे @bricker द्वारा उल्लिखित है। परिणामस्वरूप एचटीएमएल स्ट्रिंग प्राप्त करने के लिए चेन '.to_s'। –

+0

सुधार: इसे श्रृंखलाबद्ध न करें लेकिन परिणामस्वरूप HTML स्ट्रिंग प्राप्त करने के लिए 'description.to_s' का उपयोग करें। यदि आप 'DOCTYPE' नहीं चाहते हैं तो आपको इसके बजाय 'नोकोगिरी :: HTML.fragment' विधि का उपयोग करना चाहिए, http://stackoverflow.com/questions/4723344/how-to-prevent-nokogiri-from-adding- डॉक्टरेट-टैग –

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 

चीयर्स

पीट

+1

यह शायद काम करेगा: 'body_dom.xpath (' .//@ class ')' (xpath की शुरुआत में अतिरिक्त बिंदु देखें) – bricker

+0

नोकोगिरी और/या लिबएक्सएमएल 2 में [एक्सपीएथ के साथ टुकड़े के अंदर एक बग है ] (https://github.com/sparklemotion/nokogiri/issues/572)। टुकड़ों के लिए वर्तमान सर्वोत्तम कार्यवाही जैसा कि आप नोट करते हैं: '// foo' के बजाय आपको 'foo | .// foo' का उपयोग करना होगा। – Phrogz

8

यह दोनों एक दस्तावेज और एक दस्तावेज टुकड़ा के साथ काम करता है:

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

या

doc = Nokogiri::HTML(...) 

सब 'शैली' का श्रेय हटाने के लिए, यदि आप एक

doc.css('*').remove_attr('style') 
संबंधित मुद्दे