2011-01-24 8 views
28

मैं xpath वाले किसी पृष्ठ से लिंक प्राप्त करने का प्रयास कर रहा हूं। समस्या यह है कि मैं केवल एक तालिका के अंदर लिंक चाहता हूं, लेकिन अगर मैं पूरे पृष्ठ पर xpath अभिव्यक्ति लागू करता हूं तो मैं उन लिंक को कैप्चर करूंगा जो मैं नहीं चाहता हूं।पायथन: xpath का स्थानीय रूप से/विशिष्ट तत्व पर

उदाहरण के लिए:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

समस्या यह है कि पूरे दस्तावेज़ को अभिव्यक्ति लागू होता है। मैं तत्व मैं चाहता हूँ, उदाहरण के लिए स्थित:

tree = lxml.html.parse(some_response) 
root = tree.getroot() 
table = root[1][5] #for example 
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

लेकिन वह है, साथ ही पूरे दस्तावेज़ में पूछताछ किए जाने की के रूप में मैं अभी भी तालिका के बाहर लिंक पर कब्जा कर रहा हूँ लगता है। This page कहता है कि "जब तत्व पर xpath() का उपयोग किया जाता है, तो XPath अभिव्यक्ति का मूल्यांकन तत्व (यदि सापेक्ष) या रूट पेड़ (यदि पूर्ण है) के विरुद्ध किया जाता है:"। तो, मैं जो उपयोग कर रहा हूं वह एक पूर्ण अभिव्यक्ति है और मुझे इसे सापेक्ष बनाने की ज़रूरत है? क्या यही है?

असल में, मैं इस तालिका के अंदर मौजूद तत्वों को फ़िल्टर करने के बारे में कैसे जा सकता हूं?

उत्तर

47

आपका xpath स्लैश (/) से शुरू होता है और इसलिए पूर्ण है। एक बिंदु (.) सामने जोड़े यह वर्तमान तत्व अर्थात

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]") 
+0

यदि मैं डॉट जोड़ता हूं, तो यह फिर से खोजना प्रतीत नहीं होता है (जैसा कि, यह केवल उस तत्व पर खोज करता है)। कम से कम यही मुझे लगता है, क्योंकि जब मैं इसे रिश्तेदार बनाता हूं तो फ़िल्टर अब काम नहीं करता है। क्या उस तत्व से खोज करने के बजाय इसे उस तत्व से खोजने का कोई तरीका है? –

+0

@pvt pns यह एक मजबूत संकेतक है और कुछ गलत है। क्या आप एक पूर्ण उदाहरण अपलोड और लिंक कर सकते हैं? यदि आप ऐसा नहीं करना चाहते हैं, तो आप सीधे मुझसे संपर्क भी कर सकते हैं (संपर्क विकल्पों को देखने के लिए मेरे नाम पर क्लिक करें) – phihag

+0

@phihag: आपने लिखा * एक जोड़ें "।" (डॉट) इसे रिश्तेदार बनाने के लिए सामने *। आप एक वंश अभिव्यक्ति के रूप में 'वंश :: एक [शामिल (@href, ...)]' का उपयोग भी कर सकते हैं। –

0

एक अन्य विकल्प आपके तालिका के अंदर तत्वों के लिए सीधे पूछने के लिए किया जाएगा के सापेक्ष बनाने के लिए। उदाहरण के लिए:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//table[**criteria**]//a[contains(@href, 'http://www.example.com/filter/')]") 

कहाँ **criteria** आवश्यक है यदि पृष्ठ में कई तालिकाओं कर रहे हैं। कुछ संभावित मानदंड तालिका आईडी या कक्षा के आधार पर फ़िल्टर करना होगा। उदाहरण के लिए:

links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]") 
संबंधित मुद्दे