2013-01-31 98 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 $300Keyboard $20。我用這個xpath

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

但它選擇<span class="abc">Monitor</span> <b>$300</b>。我不想要標籤。我如何獲得文本?

+0

'text()'不應該選擇元素。您使用的是什麼XML解析器? – choroba

+0

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

+0

你如何獲得價值?在DOM Level 3單詞中,您可以選擇「p」元素,例如'// div [a [contains(。,「Add to cart」)]]/p'然後訪問'textContent'屬性來獲取純文本內容。 –

回答

22

您想選擇所有後代文本,不只是孩子的文字:

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

ptext()之間存在的雙斜線。

雖然這可能也會包含大量的內部標記空白,但您需要清理它。使用示例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

很高興爲你工作。 :-)我只是確保你明白空白的來源以及如何清理它。 –

相關問題