Как выбрать следующий тег sibling / xml с помощью xpath - PullRequest
82 голосов
/ 29 июня 2010

У меня есть 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>

В конце я хотел бы иметь класс для CPU (который уже настроен), который состоит из типа Brand, Series, Cores и Socket для хранения каждой из данных. Это единственный способ сделать это:

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

И делает это для остальных значений. Как бы я справился с этим, и есть ли более простой способ сделать это?

Ответы [ 2 ]

176 голосов
/ 29 июня 2010

Как бы я справился с ней, и есть ли более простой способ сделать это?

Вы можете использовать :

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

но я бы предпочел использовать напрямую :

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

Это предполагает, что :

  1. Узел контекста, противвычисление выражения XPath является родителем всех элементов tr - не показано в вашем вопросе.

  2. Каждый элемент tr имеет только один td с classатрибут оценен 'name' и только один td с class атрибут оценен 'desc'.

7 голосов
/ 29 июня 2010

Попробуйте ось following-sibling (following-sibling::td).

...