У меня есть файл HTML (от Newegg), и их HTML организован, как показано ниже. Все данные в их таблице спецификаций представлены как « desc », а заголовки каждого раздела - « name». 'Ниже приведены два примера данных со страниц 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>
В конце концов, я хотел бы иметь класс для ЦП (который уже настроен), который состоит из типа Brand, Series, Cores и Socket для хранения каждого из данных. Это единственный способ, который я могу придумать для этого:
if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text
И проделаем то же самое с остальными ценностями. Как бы я мог сделать это и есть ли более простой способ сделать это?
td[@class='name']
он сломается. См. Этот вопрос для подробностей.contains(concat(' ', @class, ' '), ' name ')
. Но в этом вопросе атрибуты @class имеют только одиночные значения../following-sibling::td
./
. Кроме того, если вы хотите выбрать ближайшего следующего брата, используйте:, вfollowing-sibling::td[1]
противном случае, если следующих братьев и сестер несколько, будут выбраны все.Попробуйте
following-sibling
ось (following-sibling::td
).источник