2012-11-27 10 views
5

मैं वेब स्क्रैपिंग के लिए Google डॉक्स का उपयोग कर रहा हूं। अधिक विशेष रूप से, मैं IMPORTXML फ़ंक्शन में निर्मित Google शीट का उपयोग कर रहा हूं जिसमें मैं डेटा को स्क्रैप करने के लिए नोड्स का चयन करने के लिए XPath का उपयोग करता हूं।XPath सरल सशर्त बयान? यदि नोड एक्स मौजूद है, तो वाई करें?

जो मैं करने की कोशिश कर रहा हूं वह मूल रूप से जांचता है कि कोई विशेष नोड मौजूद है, यदि हां, तो कुछ अन्य यादृच्छिक नोड का चयन करें।

/*IF THIS NODE EXISTS*/ 
if(exists(//table/tr/td[2]/a/img[@class='special'])){ 

    /*SELECT THIS NODE*/ 
    //table/tr/td[2]/a 

} 

उत्तर

7

आपके पास XPath में बिल्कुल तर्क नहीं है, लेकिन आप जो कुछ भी चाहते हैं उसे करने में सक्षम हो सकते हैं।

यदि आप //table/tr/td[2]/a चुनना चाहते हैं, लेकिन केवल अगर इसमें img[@class='special'] है, तो आप //table/tr/td[2]/a[img[@class='special']] का उपयोग कर सकते हैं।

आप किसी अन्य परिस्थिति में कुछ अन्य नोड का चयन करना चाहते हैं, तो आप संघ दो रास्ते (| ऑपरेटर), और बस सुनिश्चित करें कि प्रत्येक एक फिल्टर ([] अंदर), है कर सकता है कि पारस्परिक रूप से विशिष्ट है, एक हो होने की तरह एक पथ और दूसरा उस पथ के not() हो। मैं एक उदाहरण दूंगा, लेकिन मुझे यकीन नहीं है कि "अन्य यादृच्छिक नोड" आप क्या चाहते हैं ... शायद आप स्पष्टीकरण दे सकते हैं?

मुख्य बात यह है कि XPath को एक प्रश्नोत्तरी भाषा के रूप में सोचना है, प्रक्रियात्मक नहीं, इसलिए आपको चयनकर्ताओं और फ़िल्टरों के बारे में सोचने की आवश्यकता है, जो अधिकांश प्रोग्रामर की तुलना में समस्याओं के बारे में सोचने का एक अलग तरीका है सेवा मेरे। लेकिन तथ्य यह है कि फिल्टर को विशेष रूप से चयनकर्ता से संबंधित होने की आवश्यकता नहीं है (उदाहरण के लिए, आपके पास एक फ़िल्टर हो सकता है जो दस्तावेज की जड़ को देखना शुरू कर देता है) कुछ शक्तिशाली (यदि पढ़ने में कठोर) संभावनाएं होती है।

+0

धन्यवाद। मैं मूल रूप से '// div/div/table/tr/td [2]/a/img [@ class =' ​​special ']' जैसे गहरे पथ की जांच करने की कोशिश कर रहा हूं और यदि यह मौजूद है तो उसी पथ से डेटा प्राप्त करें लेकिन एक कुछ कदम पीछे: '// div/div/table/tr/td [2]/a' और तत्व जिनके पास उनके बच्चे पर लागू 'विशेष' वर्ग नहीं है: । – AnchovyLegend

+1

तब मुझे लगता है कि '// table/tr/td [2]/a [img [@ class =' ​​special ']]' जिसका मैंने उल्लेख किया है वह वह चीज है जिसे आप ढूंढ रहे हैं। यह केवल 'ए' तत्व प्राप्त करता है जिसमें' img' तत्व होता है जिसमें 'विशेष' वर्ग होता है। –

1

उपयोग: उत्तर के लिए

/self::node()[//table/tr/td[2]/a/img[@class='special']] 
    //table/tr/td[2]/a 
संबंधित मुद्दे