如何使用xpath选择以下同级/ xml标记


102

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

<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

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

Answers:


205

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

您可以使用

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

但我宁愿直接使用

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

这假定

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

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


请注意,使用类时必须小心。当您的“名称”类元素同时具有任何其他类时,td[@class='name']将中断。有关详细信息,请参见此问题
gm2008 2015年

@ gm2008,是的,如果@class属性的值中有多个类,则使用的谓词为:contains(concat(' ', @class, ' '), ' name ') 。但是在这个问题上,@class属性确实只有一个值。
Dimitre Novatchev

相对于元素:./following-sibling::td
约翰·吉岑

2
@JohnGietzen,回复:“相对于元素”-您的意思是如果上下文节点是我们感兴趣的元素。在这种情况下,可以省略./。此外,如果要选择紧随其后的同级兄弟,请使用:following-sibling::td[1],否则,如果后面有多个同级兄弟,则将全部选中。
Dimitre Novatchev '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.