代码之家  ›  专栏  ›  技术社区  ›  Robo Robok

为什么我无法使用Dom\HTMLDocument搜索标签?

  •  2
  • Robo Robok  · 技术社区  · 8 月前

    我正在尝试使用 Dom\HtmlDocument 这是PHP 8.4中的新功能。

    假设我只需要计算所有div:

    <?php
    
    $html = <<<HTML
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Example</title>
    </head>
    <body>
        <div>Hello</div>
    </body>
    </html>
    HTML;
    
    $doc = Dom\HTMLDocument::createFromString($html);
    $xpath = new Dom\XPath($doc);
    
    // No divs found:
    $divs = $xpath->query('//div');
    echo $divs->count(); // 0
    
    // 6 elements found, including the div:
    $anyTags = $xpath->query('//*');
    echo $anyTags->count(); // 6
    

    正如你所看到的,当我使用 * 要抓取任何元素,它都会按预期工作,甚至找到div。

    为什么我不能使用标签选择器?我尝试了一些带有类名等更花哨的选择器,只要我使用,它就可以正常工作 * 而不是特定的标签。

    1 回复  |  直到 8 月前
        1
  •  2
  •   phihag    8 月前

    默认情况下, Dom\HTMLDocument::createFromString 在命名空间中创建所有节点 http://www.w3.org/1999/xhtml 因此,如果你想通过XPath进行查询,你需要进行一个基于名称空间的查询,比如

    $xpath->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml');
    $divs = $xpath->query('//xhtml:div');
    

    如果你想要无命名空间的HTML(如99%的用例),请通过 Dom\HTML_NO_DEFAULT_NS Dom\HTML文档::createFromString :

    $doc = Dom\HTMLDocument::createFromString(
        $html, Dom\HTML_NO_DEFAULT_NS);
    $divs = $xpath->query('//div'); // returns 1 div
    
    推荐文章