domxpath — извлечь теги li из второго ul

Я пытаюсь извлечь только теги li второго ul из следующего. К сожалению, в html нет классов или идентификаторов, которые могли бы помочь

<ul>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
</ul>

<ul>
    <li>Some more text</li>
    <li>Some more text</li>
    <li>Some more text</li>
</ul>

Я пробовал (на самом деле несколько вещей):

    $ul = $xpath->query('//ul')->item(1);
    $query = '/li';
    $lis = $xpath->evaluate($query, $ul);

Думая, что это даст мне вторую ул, и тогда я смогу извлечь оттуда. Это дает мне второй html ul, но я явно что-то неправильно понимаю с `-> Evaluate? потому что мои ли - это все ли, а не только со второй ул.


person jmadsen    schedule 04.05.2013    source источник


Ответы (2)


Вы можете получить к ним прямой доступ с помощью XPath:

$xpath->query('//ul[2]/li');

Пример:

$html = <<<EOF
<ul>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
</ul>

<ul>
    <li>Some more text</li>
    <li>Some more text</li>
    <li>Some more text</li>
</ul>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($html);

$selector = new DOMXpath($doc);

// iterate through them...
foreach($selector->query('//ul[2]/li') as $li) {
    echo $li->nodeValue . PHP_EOL;
}

~

person hek2mgl    schedule 04.05.2013
comment
Нет, это дает мне второй li для обоих ul - я хочу все li от второго ul - person jmadsen; 04.05.2013
comment
но вы все равно дали мне ответ :-) //ul[2]/li Спасибо - person jmadsen; 04.05.2013
comment
да, спасибо. Приходится ждать 5 минут, чтобы принять, но это то, что мне нужно - person jmadsen; 04.05.2013

Если вы хотите использовать узел контекста (как в вашем вопросе), добавьте точку впереди (точка в xpath — это текущий узел), чтобы она относилась к узлу контекста, а не до корня:

$query = './li';
          #
$lis = $xpath->evaluate($query, $ul);

Или просто без косой черты впереди:

$query = 'li';              
$lis = $xpath->evaluate($query, $ul);

См. также/сравните с: Поиск по XPath под заданным элементом.

person hakre    schedule 04.05.2013
comment
Это правильно, что вы говорите. Но вы также можете просто использовать li. Как в файловой системе. Вам не понадобится ведущий ./ - person hek2mgl; 04.05.2013
comment
Насколько я знаю, в simplexml xpath да, в domxpath я не совсем уверен, всегда ли это так. так что я там часто использую с точкой. технически просто использование li должно быть правильным xpath относительно узла контекста, да. - person hakre; 04.05.2013
comment
не могу себе представить, как simplexml связан с тем же libxml.. вы должны попробовать. возможно, вы сэкономите немного ./ в будущем ;) - person hek2mgl; 04.05.2013
comment
Да, может быть, это просто я схожу с ума без причины :) Что касается ответа здесь, я, по крайней мере, едва могу отговорить меня от этого здесь, говоря, что из-за косой черты вам нужно поставить точку, вы знаете :) - исправлено + большое спасибо @ хек2мгл - person hakre; 04.05.2013
comment
maybe it's just me going crazy without reason такие вещи я знаю ;) .. +1 за ответ - person hek2mgl; 04.05.2013