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

时间:2010-06-29 09:29:12

标签: xml xpath lxml

我有一个HTML文件(来自Newegg),他们的HTML组织如下。其规格表中的所有数据均为“ desc ”,而每个部分的标题均为“名称。”以下是来自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

为其余值执行此操作。我如何完成nextsibling并且有更简单的方法吗?

3 个答案:

答案 0 :(得分:173)

  

我将如何完成nextsibling   并且有一种更简单的方法   此?

您可以使用

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

但我宁愿直接使用

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

这假定

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:0)

出于完整性考虑-在上面添加了可接受的答案-如果您对任何同级元素(无论元素类型如何)感兴趣,则可以使用变体形式:

following-sibling::*