我试图从以下中仅提取第二个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;评估?因为我的李是所有的李,而不仅仅是第二次。
答案 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进行比较。