Xpath का उपयोग करके निम्नलिखित सिबलिंग / xml टैग का चयन कैसे करें


102

मेरे पास एक HTML फ़ाइल (Newegg से) है और उनका HTML नीचे की तरह व्यवस्थित है। उनकी विशिष्टताओं की तालिका में सभी डेटा ' अवरोही ' हैं जबकि प्रत्येक अनुभाग के शीर्षक ' नाम ' में हैं 'नीचे Newegg पृष्ठों के डेटा के दो उदाहरण हैं।

<tr>
    <td class="name">Brand</td>
    <td class="desc">Intel</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Core i5</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">LGA 1156</td>

<tr>
    <td class="name">Brand</td>
    <td class="desc">AMD</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Phenom II X4</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">Socket AM3</td>
</tr>

अंत में मैं एक सीपीयू (जो पहले से सेट है) के लिए एक वर्ग रखना चाहूंगा जिसमें एक ब्रांड, श्रृंखला, कोर और सॉकेट प्रकार शामिल हैं जो प्रत्येक डेटा को स्टोर करने के लिए है। यह एकमात्र तरीका है जिससे मैं ऐसा करने के बारे में सोच सकता हूं:

if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
    CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text

और बाकी मूल्यों के लिए ऐसा कर रहे हैं। मैं नेक्स्टसिबलिंग को कैसे पूरा करूंगा और क्या ऐसा करने का एक आसान तरीका है?

जवाबों:


205

मैं नेक्स्टसिबलिंग को कैसे पूरा करूंगा और क्या ऐसा करने का एक आसान तरीका है?

आप उपयोग कर सकते हैं :

tr/td[@class='name']/following-sibling::td

लेकिन मैं सीधे उपयोग करूँगा :

tr[td[@class='name'] ='Brand']/td[@class='desc']

यह मानता है कि :

  1. संदर्भ नोड, जिसके खिलाफ एक्सपीथ अभिव्यक्ति का मूल्यांकन किया जाता है, सभी trतत्वों का जनक है - आपके प्रश्न में नहीं दिखाया गया है।

  2. प्रत्येक trतत्व केवल एक ही है tdसाथ classमहत्वपूर्ण विशेषता 'name'है और केवल एक tdसाथ classविशेषता मूल्यवान 'desc'


ध्यान दें कि आपको कक्षा का उपयोग करने के बारे में सावधान रहना होगा। जब आपके 'नाम' वर्ग के तत्वों में एक ही समय में कोई अन्य वर्ग होता है, td[@class='name']तो टूट जाएगा। देखें इस सवाल जानकारी के लिए।
gm2008

@ gm2008, हां, यदि @class विशेषता के मान में एक से अधिक वर्ग हैं, तो उपयोग करने के लिए विधेय है contains(concat(' ', @class, ' '), ' name ') :। लेकिन इस प्रश्न में @class विशेषताएँ केवल एकल मान हैं।
दिमित्रे नोवत्चेव

एक तत्व के सापेक्ष:./following-sibling::td
जॉन गीत्ज़ेन

2
@ जोहान्ज़्ज़ेन, रे: "ए रिलेटिव टू ए एलिमेंट" - आपका मतलब है कि यदि संदर्भ नोड वह तत्व है जिसमें हम रुचि रखते हैं। इस मामले में आप चूक सकते हैं ./। इसके अलावा, यदि आप तत्काल निम्नलिखित भाई-बहन का चयन करना चाहते हैं, तो उपयोग करें: following-sibling::td[1]अन्यथा, यदि एक से अधिक भाई-बहन हैं, तो सभी का चयन किया जाएगा।
दिमित्रे नोवत्चेव

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