116 votes

Comment sélectionnez la suite de la fratrie/balise xml à l'aide de xpath

J'ai un fichier HTML (à partir de Newegg) et leur code HTML est organisé comme ci-dessous. Toutes les données dans leur tableau des spécifications est 'desc' tandis que les titres de chaque section sont en 'nom.' Ci-dessous, deux exemples de données à partir de Newegg pages.

<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>

En fin de compte, je voudrais avoir une classe pour un CPU (ce qui est déjà mis en place) qui consiste en une Marque, des Séries, des Noyaux, et le type de Socket pour stocker chaque ensemble de données. C'est la seule façon que je peux penser à aller à ce sujet:

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

Et le faire pour le reste des valeurs. Comment pourrais-je accomplir la nextsibling, et est-il un moyen plus facile de faire cela?

Merci beaucoup

241voto

Dimitre Novatchev Points 147842

Comment pourrais-je accomplir la nextsibling et est-il un moyen plus facile de faire cette?

Vous pouvez utiliser:

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

mais je préfère utiliser directement:

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

Cela suppose que:

  1. Le nœud de contexte, contre laquelle l'expression XPath est évaluée est le parent de tous tr éléments -- non indiqué dans votre question.

  2. Chaque tr élément n'a qu'un seul td avec class attribut apprécié 'name' et un seul td avec class attribut apprécié 'desc'.

17voto

Philipp Points 21479

Essayez l' following-sibling axe (following-sibling::td).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X