使用 XPath 获取 HTML 元素的文本内容?

Posted

技术标签:

【中文标题】使用 XPath 获取 HTML 元素的文本内容?【英文标题】:Get text content of an HTML element using XPath? 【发布时间】:2013-01-15 21:31:57 【问题描述】:

查看这个 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()

但它选择了&lt;span class="abc"&gt;Monitor&lt;/span&gt; &lt;b&gt;$300&lt;/b&gt;。我不想要标签。如何只获取文本?

【问题讨论】:

text() 永远不应该选择元素。你用的是什么 XML 解析器? @choroba scrapy.selector.lxmlsel.HtmlXPathSelector 您如何访问该值?在 DOM Level 3 单词中,您可以选择 p 元素,例如//div[a[contains(., "Add to cart")]]/p 然后访问textContent 属性以获取纯文本内容。 @MartinHonnen 我正在使用XPathSelector 【参考方案1】:

您想选择所有后代文本,而不仅仅是子文本:

//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']

【讨论】:

哇!那双 // 拯救了我的一天 很高兴为您工作。 :-) 我只是确保您了解空格的来源以及如何清理它。

以上是关于使用 XPath 获取 HTML 元素的文本内容?的主要内容,如果未能解决你的问题,请参考以下文章

在 XPath 中获取(文本)

如何使用 Xpath 获取纯文本

使用 XPath 将文本打印到一个元素 - PHP

使用 php 和 xpath 获取父元素的内部 HTML

在 Selenium 测试中使用 XPath 通过文本获取 WebElement

按文本查找元素并获取xpath - selenium webdriver junit