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

标签 html xml xpath html-parsing

查看此 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> .我不想要标签。如何只获取文本?

最佳答案

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

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

关于html - 使用 XPath 获取 HTML 元素的文本内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631590/

相关文章:

jquery - 我无法更改 codrops 下拉菜单中的字体系列

javascript - 鼠标离开后强制 gif 重新加载

javascript - 搜索框 : autosuggestion with XML

xml - 在 R 中使用 getNodeSet 进行复杂的 xPath 查询

java - 如何使用java在文档中追加新节点

html - 如何制作上下垂直线

xml - feed.Entry未定义(类型Feed没有字段或方法Entry)

java - 简单的 Jackson XML 反序列化到 Java 不起作用

xml - xpath 通过索引获取元素

html - 图像变换旋转不旋转