如何使用 XPath 选择以下同级/XML 标记

Posted

技术标签:

【中文标题】如何使用 XPath 选择以下同级/XML 标记【英文标题】:How to select following sibling/XML tag using XPath 【发布时间】:2011-03-09 12:55:58 【问题描述】:

我有一个 html 文件(来自 Newegg),它们的 HTML 组织如下。他们的规格表中的所有数据都是“desc”,而每个部分的标题都在“name.”中。下面是来自 Newegg 页面的两个数据示例。 p>

<tr>
    <td class="name">Brand</td>
    <td class="desc">Intel</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Core i5</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">LGA 1156</td>

<tr>
    <td class="name">Brand</td>
    <td class="desc">AMD</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Phenom II X4</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">Socket AM3</td>
</tr>

最后,我希望有一个用于 CPU 的类(已经设置),它由 Brand、Series、Cores 和 Socket 类型组成,用于存储每个数据。这是我能想到的唯一方法:

if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
    CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text

并为其余的值执行此操作。我将如何完成下一个兄弟姐妹,有没有更简单的方法?

【问题讨论】:

【参考方案1】:

我将如何完成下一个兄弟姐妹 有没有更简单的方法 这个?

您可以使用

tr/td[@class='name']/following-sibling::td

但我宁愿直接使用

tr[td[@class='name'] ='Brand']/td[@class='desc']

假设

    评估 XPath 表达式所依据的上下文节点是所有 tr 元素的父级 - 未在您的问题中显示。

    每个tr元素只有一个tdclass属性值为'name',只有一个tdclass属性值为'desc'

【讨论】:

请注意,您必须小心使用类。当您的“名称”类元素同时具有任何其他类时,td[@class='name'] 将中断。详情请见this question。 @gm2008,是的,如果@class 属性的值中有多个类,则要使用的谓词是:contains(concat(' ', @class, ' '), ' name ')。但在这个问题中,@class 属性确实只有单个值。 相对于一个元素:./following-sibling::td @JohnGietzen, Re: "Relative to an element" -- 你的意思是如果 context 节点 是我们感兴趣的元素。在这种情况下你可以省略 @987654335 @ .另外,如果要选择紧随其后的兄弟,请使用:following-sibling::td[1],否则,如果有多个以下兄弟,则将全部选中。【参考方案2】:

试试following-sibling 轴 (following-sibling::td)。

【讨论】:

【参考方案3】:

为了完整性-添加到上面接受的答案-如果您对任何兄弟元素感兴趣,无论元素类型如何,您都可以使用变体:

following-sibling::*

【讨论】:

以上是关于如何使用 XPath 选择以下同级/XML 标记的主要内容,如果未能解决你的问题,请参考以下文章

无论特定 Id 如何,如何使用 XPath 选择类别 XML 节点?

xpath路径定位

XPath 根据基本同级值获取同级

如何使用 xpath 选择名称空间定义标记

如何找出此 XML 中 <Result> 标记的 XPath?

使用 xpath 同时选择属性和内容?