Eu tenho um arquivo HTML (da Newegg) e seu HTML está organizado como abaixo. Todos os dados em sua tabela de especificações são ' desc ', enquanto os títulos de cada seção estão em ' name. 'Abaixo estão dois exemplos de dados das páginas 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>
No final, gostaria de ter uma classe para uma CPU (que já está configurada) que consistisse em um tipo de Marca, Série, Núcleos e Soquete para armazenar cada um dos dados. Esta é a única maneira que consigo pensar para fazer isso:
if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text
E fazendo isso para o resto dos valores. Como eu realizaria o próximo e há uma maneira mais fácil de fazer isso?
td[@class='name']
haverá falha. Veja esta pergunta para detalhes.contains(concat(' ', @class, ' '), ' name ')
. Mas, nesta questão, os atributos @class têm apenas valores únicos../following-sibling::td
./
. Além disso, se você quiser selecionar o irmão seguinte imediato, use:,following-sibling::td[1]
caso contrário, se houver mais de um irmão seguinte, todos serão selecionados.Experimente o
following-sibling
eixo (following-sibling::td
).fonte