2013-01-31 11 views
16

Vai a questa htmlOttieni il contenuto di testo di un elemento HTML usando XPath?

<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> 

Utilizzando XPath voglio analizzare Monitor $300 e Keyboard $20. Io uso questo XPath

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

Ma seleziona <span class="abc">Monitor</span> <b>$300</b>. Non voglio i tag. Come ottengo solo il testo?

+0

'text()' non deve mai selezionare elementi. Quale parser XML stai usando? – choroba

+0

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

+0

Come si accede al valore? Nella parola DOM livello 3 selezionare gli elementi 'p' con ad es. '// div [a [contiene (.," Aggiungi al carrello ")]]/p' e quindi accede alla proprietà' textContent' per ottenere il contenuto di testo normale. –

risposta

22

si desidera selezionare tutti discendente testo, non solo il testo bambino:

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

nota la doppia barra tra il p e text() lì.

Questo potenzialmente includerà anche molti spazi tra tag diversi, è necessario pulirlo. Esempio utilizzando 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

Wow! quel doppio '//' salva la mia giornata –

+0

Io uso lo stesso identico codice per rimuovere gli spazi bianchi però. –

+1

Felice che ha funzionato per te. :-) Stavo solo facendo in modo di capire da dove viene lo spazio bianco e come pulirlo. –

Problemi correlati