3

我试图从以下内容中仅提取第二个 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,但我显然误解了 `->evaluate? 因为我的 li 都是 li 的,而不仅仅是来自第二个 ul。

4

2 回答 2

6

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

~

于 2013-05-04T09:34:58.307 回答
2

如果您想使用上下文节点(如您的问题),请在前面添加一个点(xpath 中的点是当前节点)以相对于上下文节点,而不是上升到根:

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

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

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

参见/比较:Search by XPath under a given element

于 2013-05-04T09:42:09.207 回答