2013-01-31 45 views
16

इस एचटीएमएलXPath का उपयोग कर HTML तत्व की टेक्स्ट सामग्री प्राप्त करें?

<div> 
    <p> 
    <span class="abc">Monitor</span> <b>$300</b> 
    </p> 
    <a href="/add">Add to cart</a> 
</div> 
<div> 
    <p> 
    <span class="abc">Keyboard</span> $20 
    </p> 
    <a href="/add">Add to cart</a> 
</div> 

देखें xpath का उपयोग करते हुए मैं Monitor $300 और Keyboard $20 पार्स करने के लिए चाहता हूँ। मैं इस xpath का उपयोग

//div[a[contains(., "Add to cart")]]/p/text() 

लेकिन यह <span class="abc">Monitor</span> <b>$300</b> चयन करता है। मुझे टैग नहीं चाहिए। मैं केवल पाठ कैसे प्राप्त करूं?

//div[a[contains(., "Add to cart")]]/p//text() 

नोट p और text() वहाँ के बीच डबल स्लैश:

+0

'टेक्स्ट() 'तत्वों का चयन कभी नहीं करना चाहिए। आप किस एक्सएमएल पार्सर का उपयोग कर रहे हैं? – choroba

+0

@choroba 'scrapy.selector.lxmlsel.HtmlXPathSelector' –

+0

आप मूल्य का उपयोग कैसे करते हैं? डीओएम स्तर 3 शब्द में आप 'पी' तत्वों का चयन करेंगे उदा। '// div [a [इसमें (।," कार्ट में जोड़ें ")]]/p' और फिर सादे पाठ सामग्री प्राप्त करने के लिए' textContent' प्रॉपर्टी तक पहुंचें। –

उत्तर

22

आप सभी वंशज पाठ का चयन करने के लिए ही नहीं, बच्चे को पाठ चाहते हैं।

हालांकि संभावित रूप से इसमें बहुत से इंटर-टैग व्हाइटस्पेस भी शामिल होंगे, आपको इसे साफ़ करने की आवश्यकता होगी। उदाहरण lxml का उपयोग कर उदाहरण:

>>> import lxml.etree as ET 
>>> tree = ET.fromstring('''<div> 
... <div> 
...  <p> 
...  <span class="abc">Monitor</span> <b>$300</b> 
...  </p> 
...  <a href="/add">Add to cart</a> 
... </div> 
... <div> 
...  <p> 
...  <span class="abc">Keyboard</span> $20 
...  </p> 
...  <a href="/add">Add to cart</a> 
... </div> 
... </div>''') 
>>> tree.xpath('//div[a[contains(., "Add to cart")]]/p//text()') 
['\n ', 'Monitor', ' ', '$300', '\n ', '\n ', 'Keyboard', ' $20 \n '] 
>>> res = _ 
>>> [txt for txt in (txt.strip() for txt in res) if txt] 
['Monitor', '$300', 'Keyboard', '$20'] 
+4

वाह का उपयोग कर रहा हूं! कि डबल '//' मेरा दिन बचाता है –

+0

हालांकि मैं सफेद रिक्त स्थान को हटाने के लिए सटीक उसी कोड का उपयोग करता हूं। –

+1

खुशी है कि आपके लिए काम किया है। :-) मैं बस यह सुनिश्चित कर रहा था कि आप समझते हैं कि व्हाइटस्पेस कहां से आता है और इसे कैसे साफ किया जाए। –