【问题标题】:domxpath - Extract li tags from second uldomxpath - 从第二个 ul 中提取 li 标签
【发布时间】:2013-04-28 16:12:45
【问题描述】:

我试图从以下内容中仅提取第二个 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。

【问题讨论】:

    标签: php domxpath


    【解决方案1】:

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

    ~

    【讨论】:

    • 不,这给了我两个 ul 的第二个 li - 我想要第二个 ul 的所有 li
    • 但你还是给了我答案:-) //ul[2]/li 谢谢
    • 好的,谢谢。必须等待 5 分钟才能接受,但这就是我所追求的
    【解决方案2】:

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

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

    或者只是前面没有斜线:

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

    也可以查看/比较:Search by XPath under a given element

    【讨论】:

    • 你说的没错。但是你也可以使用li。就像在文件系统中一样。你不需要领先的./
    • AFAIK in simplexml xpath 是的,在 domxpath 中我不完全确定是否总是如此。所以我经常用dot。从技术上讲,仅使用 li 相对于上下文节点也应该是正确的 xpath,是的。
    • 无法想象 simplexml 与同一个 libxml.. 链接。您应该尝试一下。也许您将来会节省一些./ ;)
    • 是的,也许只是我无缘无故地发疯了 :) 对于这里的答案,我至少不能在这里说服我说因为斜线你需要去掉点,你知道:) - 已修复 + 非常感谢 @hek2mgl
    • maybe it's just me going crazy without reason 我知道这样的事情 ;) .. +1 回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2012-03-13
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多