मैं XPath के साथ CSS वर्ग द्वारा एक तत्व कैसे खोज सकता हूं?


296

मेरे वेबपेज में, नाम के divसाथ है ।classTest

मैं इसे कैसे पा सकता हूं XPath?



अधिक सामान्य संबंधित XPath, CSS, DOM और सेलेनियम सॉल्यूशंस दस्तावेज़ XPath, CSS, DOM और सेलेनियम: द रोसेटा स्टोन में पाए जा सकते हैं । विशेष रूप से, आपका उत्तर आइटम आईडी और नाम में पाया जा सकता है ।
टेरेंस एक्स

जवाबों:


472

यह चयनकर्ता काम करना चाहिए, लेकिन यदि आप इसे अपने अनुकूल मार्कअप के साथ बदलते हैं तो यह अधिक कुशल होगा:

//*[contains(@class, 'Test')]

या, जब से हम जानते हैं कि मांगी गई तत्व एक है div:

//div[contains(@class, 'Test')]

लेकिन चूंकि यह class="Testvalue"या तो जैसे मामलों से मेल खाएगा या class="newTest", @ तोमालक का संस्करण टिप्पणी में बेहतर है :

//div[contains(concat(' ', @class, ' '), ' Test ')]

यदि आप वास्तव में निश्चित होना चाहते हैं कि यह सही ढंग से मेल खाएगा, तो आप क्लास नाम के अनुसार आवारा व्हाट्सएप पात्रों को साफ करने के लिए सामान्य-स्थान फ़ंक्शन का उपयोग भी कर सकते हैं (जैसा कि @Terry द्वारा उल्लेख किया गया है):

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

ध्यान दें कि इन सभी संस्करणों में, * सबसे अच्छा होना चाहिए कि जिस भी तत्व का नाम आप वास्तव में मिलान करना चाहते हैं, जब तक आप दस्तावेज़ में प्रत्येक और प्रत्येक तत्व को दी गई स्थिति के लिए खोज नहीं करना चाहते।


37
@ रेडर: अधिक पसंद //div[contains(concat(' ', @class, ' '), ' Test ')]- आपके आंशिक मैचों को भी चालू करेगा।
टॉमालक

5
आप सिर्फ // div [@ class = 'Test'] क्यों नहीं करते हैं
जेसिका

11
क्‍योंकि कक्षाओं में एक से अधिक मूल्‍य हो सकते हैं
मध्‍य सर्वग्राही

8
मुझे आश्चर्य है कि xpath के पास अंतरिक्ष-अलग-अलग टोकन सूची में टोकन खोजने के लिए कोई शॉर्टकट / अधिक कुशल तरीका नहीं है। Xpath के बाद के संस्करणों में कुछ भी?
थोमसट्रेटर

1
@thomasrutter क्यों आश्चर्य - यह सिर्फ XML के लिए बनाई गई भाषा है, न कि अधिक विशिष्ट HTML, और जो यह कहना है कि यह XML में किसी भी नोड मान के रूप में अंतरिक्ष-पृथक सूचियों का उपयोग करने के लिए आकस्मिक है। तोमलक का हल बहुत ही व्यवहार्य है।
बिटूलियन

152

सबसे आसान तरीका ।।

//div[@class="Test"]

मान लें कि आप <div class="Test">वर्णित के रूप में खोजना चाहते हैं ।


3
उपरोक्त सिंटैक्स का उपयोग करना बहुत आसान है और कम त्रुटि वाला है। याद रखने के लिए आपको खोज करने के लिए कक्षा के आसपास बहुत सारे उद्धरण चाहिए। मैं ऊपर सूचीबद्ध का उपयोग करने की सलाह दूंगा। // div [@ वर्ग = "टेस्ट"]
फ्लाइंगवी

क्या यह उन मामलों के लिए काम करता है जो div [class = 'Test'] गहरे स्तर पर हैं?
जेक ०३२

1
@ Jake0x32, ऐसा इसलिए है क्योंकि यह //न केवल उपयोग करता है /
सोलोमन उको

7
क्या यह `<div class =" टेस्ट कुछ-अन्य-क्लास "> से भी मेल खाता है?
जुगल ठक्कर

11
@ जुगलचक्कर नहीं, यह नहीं है। इसे काम करने के लिए एक सटीक मिलान की आवश्यकता होती है लेकिन आप इसके बजाय // div [(@class, "Test")] की कोशिश कर सकते हैं।
ओली पुलजुला

29

XPath के साथ करने का एकमात्र सही तरीका:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

फ़ंक्शन normalize-spaceव्हाट्सएप को लीड करता है और अनुगामी करता है, और एक सिंगल स्पेस द्वारा व्हॉट्सएप के पात्रों के अनुक्रम को भी बदलता है।


ध्यान दें

यदि इन Xpath प्रश्नों में से कई की आवश्यकता नहीं है, तो आप एक पुस्तकालय का उपयोग करना चाह सकते हैं जो CSS चयनकर्ताओं को XPath में परिवर्तित करता है, क्योंकि CSS चयनकर्ता आमतौर पर XPath प्रश्नों की तुलना में पढ़ने और लिखने दोनों के लिए बहुत आसान होते हैं। उदाहरण के लिए, इस मामले में, आप दोनों का उपयोग कर सकते हैं div[class~="Test"]और div.Testसमान परिणाम प्राप्त कर सकते हैं ।

कुछ पुस्तकालय जो मैं पा सका हूँ:


24

मैं इसे केवल एक उत्तर के रूप में प्रदान कर रहा हूं, जैसा कि टॉमालक ने बहुत समय पहले पदक के उत्तर के लिए एक टिप्पणी के रूप में प्रदान किया था

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
इस तरह के एक समय से पहले इसे लाने के लिए क्षमा करें, लेकिन concat(' ', normalize-space(@class), ' ')साथ ही साथ सभी प्रकार के श्वेत-अंतरिक्ष वर्णों के लिए क्या करना है?
टेरी

जिज्ञासा के लिए - //div[contains(concat(' ', @class, ' '), ' Test ')]/chidबच्चों का चयन क्यों नहीं किया जाता है?
फ्यूजन

@ फ्यूजन यदि आप एक प्रश्न के रूप में पोस्ट करते हैं, तो आपको उत्तर मिल सकता है।
बिटूलियन

@bitoolean कैप्टन Cb जाहिर किया जा रहा है इन दिनों मुश्किल है
फ्यूजन

@ फ्यूजन मैं सिर्फ मदद करने की कोशिश कर रहा था। XPath एक HTML- जागरूक भाषा नहीं है। यह अधिक सामान्य है, एक्सएमएल केवल। मुझे इसमें कोई अनुभव नहीं है, लेकिन मुझे लगता है कि आप मान रहे हैं कि आप टैग के बजाय सिर्फ आईडी डाल सकते हैं। आपको "आईडी" विशेषता के मूल्य पर चयन करने की आवश्यकता है। तो आपको HTML दस्तावेज़ को XML के रूप में सोचने की आवश्यकता है। ऑफ-टॉपिक चर्चाएं लोगों को समाधान खोजने में मदद नहीं करती हैं।
12

1

पिछले उत्तर से एक उपयोगी कार्य किया जा सकता है:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

फिर बस फ़ंक्शन को अपने प्रश्न में कॉल करें।


यह कोड केवल PHP में काम करेगा। आप इसका उल्लेख कर सकते थे।
बिटुलियन

0

एक वर्ग के खिलाफ मैच है जिसमें व्हाट्सएप है।

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.