domxpath - 从第二个ul中提取li标签

时间:2013-05-04 09:32:26

标签: php domxpath

我试图从以下中仅提取第二个ul的li标签。不幸的是,html中没有类或id来帮助

<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);

认为这会让我获得第二个ul,然后我可以从中提取。它确实让我得到了第二个ul的html,但我显然误解了` - &gt;评估?因为我的李是所有的李,而不仅仅是第二次。

2 个答案:

答案 0 :(得分:5)

您可以使用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;
}

答案 1 :(得分:2)

如果你想使用context-node(在你的问题中),在前面添加一个点(xpath中的点是当前节点),相对于context-node,而不是根目录:< / p>

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

或者只是没有前面的斜线:

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

请参阅/与Search by XPath under a given element进行比较。