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

Cor*_*ell 89 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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dim*_*hev 187

我如何完成nextsibling并且有更简单的方法吗?

你可以使用:

tr/td[@class='name']/following-sibling::td
Run Code Online (Sandbox Code Playgroud)

但我宁愿直接使用:

tr[td[@class='name'] ='Brand']/td[@class='desc']
Run Code Online (Sandbox Code Playgroud)

这假定:

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

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

  • @JohnGietzen,Re:"相对于一个元素" - 你的意思是如果*context节点*是我们感兴趣的元素.在这种情况下你可以省略`./`.此外,如果要选择紧随其后的兄弟,请使用:`following-sibling :: td [1]`,否则,如果有多个兄弟姐妹,则将选择所有兄弟姐妹. (2认同)

Mil*_*lan 13

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

following-sibling::*


Phi*_*ipp 8

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