2013-01-31 69 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

很高兴为你工作。 :-)我只是确保你明白空白的来源以及如何清理它。 –

相关问题