【问题标题】:xPath query not working as expected. Nodelist is emptyxPath 查询未按预期工作。节点列表为空
【发布时间】:2012-05-07 13:50:53
【问题描述】:

我有以下 HTML 片段,

我在 PHP 中使用 xPath 和 DOM 来获取 DIV 中的所有锚标记,使用以下 xPath 查询:

//div[@id="breadcrumbs"]/a

我希望上面的查询应该返回所有锚标记的 NodeList,在上面的 HTML 的情况下应该是 3。我什么也没得到,我的以下 PHP 代码正在跳过

        $breadCrumb = $xpath->query('//div[@id="breadcrumbs"]/a');      

    if($breadCrumb->length){
        $ctr = 0;
        $sections = "";
        foreach($breadCrumb as $section){
            //$productBreadCrumb['section_'.$ctr] =  $section->nodeValue;
            $sections .=  $section->nodeValue."|";
            $ctr++;
        }
        $productData['sections'] = $sections;
    }

我在这里需要指导。非常感谢。

编辑:在上面提到的 Div id="breadcumbs"> a a a 段上添加了我试图基于 xPath 查询从 DOM 获取的页面

http://www.5starhookah.com/Apex-Black-NEW-A342.htm

谢谢

谢谢

【问题讨论】:

  • 您确定 div 块不是由 Javascript 生成的吗?
  • 当我从浏览器查看页面源并查看 HTML 时,带有锚标记的 Div 也会出现在那里。我猜如果它是由 JavaScript 生成的,那么 View Source 不应该显示 DIV 和一个 HTML。这是正确的假设吗?

标签: php html xml xpath domdocument


【解决方案1】:

xpath 的常见问题:命名空间。

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

表示每个标签实际上都在http://www.w3.org/1999/xhtml 命名空间中。

查找文档以查看是否可以设置默认命名空间,或者是否可以为其设置别名(例如,如果别名为“x”,则查询将类似于 //x:div[@id="breadcrumbs" ]/x:a。

或者,您可以通过在解析 xml 之前删除字符串 « xmlns="http://www.w3.org/1999/xhtml" » 来作弊。

【讨论】:

    【解决方案2】:

    您的 XPath 是正确的,如您使用的示例 XHTML 所示:

    <div id="breadcrumbs">
    <a class='breadcrumb'>Our Products</a>
    </div>
    

    使用如下工具: http://www.xpathtester.com/

    因此,您的问题一定出在 DOM 上。如果您可以在运行 XPath 之前粘贴 DOM 的 XHTML 的打印输出,我们可以确认这一点,但似乎很清楚,除非真的很奇怪,否则您的问题出在 DOM 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      相关资源
      最近更新 更多