Mam plik HTML (z Newegg), a ich kod HTML jest zorganizowany jak poniżej. Wszystkie dane w tabeli danych technicznych jest ich „ desc ”, podczas gdy tytuły są w każdej sekcji " nazwy. Poniżej znajdują się dwa przykłady danych ze stron 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>
Na koniec chciałbym mieć klasę dla procesora (który jest już skonfigurowany), która składa się z marki, serii, rdzeni i typu gniazda do przechowywania wszystkich danych. To jedyny sposób, jaki przychodzi mi do głowy, aby to zrobić:
if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text
I robię to dla pozostałych wartości. W jaki sposób mógłbym dokonać powiązania i czy jest na to łatwiejszy sposób?
td[@class='name']
ulegną uszkodzeniu. Zobacz to pytanie, aby uzyskać szczegółowe informacje.contains(concat(' ', @class, ' '), ' name ')
. Ale w tym pytaniu atrybuty @class mają tylko pojedyncze wartości../following-sibling::td
./
. Ponadto, jeśli chcesz wybrać najbliższe rodzeństwo, użyj:, wfollowing-sibling::td[1]
przeciwnym razie, jeśli jest więcej niż jedno następujące rodzeństwo, wszystkie zostaną wybrane.Wypróbuj
following-sibling
oś (following-sibling::td
).źródło