2011-11-21 9 views
6

मैं जानना चाहता हूं कि नॉकोगिरी XPath या CSS पार्सिंग HTML फ़ाइलों के साथ तेजी से काम करता है या नहीं। गति अलग कैसे है?XPath या CSS तेजी से पार्सिंग (HTML फ़ाइलों पर नोकोगिरी के लिए)?

+4

देखें ['बेंचमार्क'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html)। –

उत्तर

18

नोकोगिरी में XPath या CSS पार्सिंग नहीं है। यह एक्सएमएल/एचटीएमएल को एक एकल डोम में पार्स करता है जिसे आप क्वेरी पर सीएसएस या एक्सपीएथ सिंटैक्स का उपयोग कर सकते हैं।

सीएसएस चयनकर्ता आंतरिक रूप से क्वेरी करने के लिए libxml2 पूछने से पहले XPath में परिवर्तित हो जाते हैं। इस तरह (सटीक समान चयनकर्ताओं के लिए) XPath संस्करण एक छोटा सा अंश तेज़ होगा, क्योंकि सीएसएस को पहले XPath में परिवर्तित करने की आवश्यकता नहीं है।

हालांकि, आपके प्रश्न का कोई सामान्य उत्तर नहीं है; यह इस बात पर निर्भर करता है कि आप किसके लिए चयन कर रहे हैं, और आपका XPath कैसा दिखता है। संभावना है कि, आप उसी XPath को नहीं लिखेंगे क्योंकि नोकोगिरी बनाता है। उदाहरण के लिए, आपको निम्न दो सीएसएस बयानों के लिए XPath अनुमान लगा सकते हैं अगर देखें: एक वेब ब्राउज़र के विपरीत

puts Nokogiri::CSS.xpath_for('#foo') 
#=> //*[@id = 'foo'] 


puts Nokogiri::CSS.xpath_for 'div.article a.external' 
#=> //div[contains(concat(' ', @class, ' '), ' article ')]//a[contains(concat(' ', @class, ' '), ' external ')] 

, id और class गुण नहीं भागा-अप कैश है, उन्हें मदद नहीं करता है के लिए बहुत का चयन। दरअसल, div.article की सामान्य व्याख्या div[@class='article'] जैसी चीज़ों की तुलना में कहीं अधिक काम करती है।

जैसा कि @ एलबीजी ने टिप्पणी की है, आपको के लिए बेंचमार्क करना चाहिए यदि पूर्ण गति है।

हालांकि, मैं यह सुझाव दूंगा: इसके बारे में चिंता न करें। कंप्यूटर तेज हैं। लिखें, प्रोग्रामर के लिए सबसे सुविधाजनक क्या है। यदि कोई सीएसएस चयनकर्ता शिल्प करना आसान है, टाइप करने के लिए तेज़ है, और बाद में आपके कोड की समीक्षा करते समय समझने में आसान है, उस का उपयोग करें। XPath का उपयोग करें जब आपको उन चीजों को करने की आवश्यकता होती है जिन्हें आप सीएसएस चयनकर्ता वाक्यविन्यास के साथ नहीं कर सकते हैं।

नोकिया को एक उचित जटिल सीएसएस को XPath में बदलने में कितना समय लगता है?

t = Time.now 
1000.times do |i| 
    # Use a different CSS string each time to avoid built-in caching 
    css = "body#foo table#bar#{i} thead th, body#foo table#bar#{i} tbody td" 
    Nokogiri::CSS.xpath_for(css) 
end 
puts (Time.now - t)/1000 
#=> 0.000405041 

से कम आधा एक millisecond

+0

हम्म, यह बिल्कुल सही है जिसे मैं लिखूंगा। :) दूसरा क्लास "ट्रिक" का उपयोग करता है जिसे आप HTML क्लास एट्रिब्यूट को पार्स करते समय उपयोग करना चाहते हैं, जिसमें कई मान रिक्त स्थान से अलग हो सकते हैं। –

+0

@Phrogz, "सीएसएस चयनकर्ता आंतरिक रूप से क्वेरी करने के लिए libxml2 पूछने से पहले XPath में परिवर्तित हो जाते हैं। ऐसे में (सटीक समान चयनकर्ताओं के लिए) XPath संस्करण एक छोटा सा अंश तेज़ होगा, क्योंकि सीएसएस को XPath में परिवर्तित करने की आवश्यकता नहीं है प्रथम।" आप XPath में एक्सेसर को लिखने के तरीके को याद रखने के लिए सिर स्क्रैचिंग समय की अनुमति देना भूल गए। :-) –

+3

+1 "इसके बारे में चिंता न करें" के लिए +1। Zactly! समझने में आसान कोड के रखरखाव में दीर्घकालिक लाभ है। मैं कंप्यूटर के समय के बारे में ज्यादा चिंता नहीं करता, यह मेरी समझ है कि मुझे क्या समझने के लिए लिखा गया था। –

संबंधित मुद्दे