【问题标题】:Can't access nodes in xhtml document with multiple namespaces through xpath无法通过 xpath 访问具有多个命名空间的 xhtml 文档中的节点
【发布时间】:2012-07-15 03:12:10
【问题描述】:

好的,所以我正在尝试使用 curl 和 xpath 解析 xhtml 站点。

该站点有多个命名空间:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:addthis="http://www.addthis.com/help/api-spec"     xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">

我正在尝试从网站的分页中获取所有网址,如下所示:

$url = [site_im_parsing];

$dom = new DOMDocument();
@$dom->loadHTML($url);  
$xpath = new Domxpath($dom);

$xpath->registerNamespace("x", "http://www.w3.org/1999/xhtml");

$pages = $xpath->query('//x:div[2]/x:table/x:tbody/x:tr/x:td[1]/x:a');

for ($i = 0; $i < $pages->length; $i++) {

    echo $pages->item($i)->getAttribute('href');

}

这不起作用。 (没有 x-namespace 的分页的 xpath 应该是正确的)。我应该注册所有命名空间并在 xpath 查询中以某种方式使用它们吗?

最好的问候, 乙

// 问题更新 //

这是我要解析的页面部分: (我想要href)

<div class="pager">
    <table style="width:100%" border="0" cellspacing="0" cellpadding="0">
        <tbody>
            <tr>
                <td>
                    <span class="current">1</span>  | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">2</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=2">3</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=3">4</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=4">5</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=5">6</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=6">7</a>        
                </td>
                <td style="text-align:right">
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">Next</a>
                </td>
            </tr>
        </tbody>
    </table>
</div>

文档类型是:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

如果这有什么不同...

【问题讨论】:

    标签: php xpath curl namespaces


    【解决方案1】:

    对于loadHTML,我希望任何命名空间都会被忽略,所以尽量不要使用registerNamespace,然后使用$xpath-&gt;query('//div[2]/table/tbody/tr/td[1]/a');。作为 XML 的替代解析,使用命名空间是有意义的。

    【讨论】:

    • 如果我只使用$xpath-&gt;query('//div[2]/table/tbody/tr/td[1]/a');,当我尝试使用echo $pages-&gt;item($i)-&gt;getAttribute('href'); 回显每个项目的href 时,结果是空的
    • $xpath-&gt;query('(//div)[2]/table/tbody/tr/td[1]/a') 是否给出了预期的结果?我们确实需要查看一个最小但完整的 (X)HTML 输入文档,以及一些关于您正在寻找哪些元素来帮助 XPath 表达式本身的解释。
    • 嗨,马丁,感谢您抽出宝贵时间来回答。我已经用我试图解析的网站上的 html 更新了这个问题。 $xpath-&gt;query('(//div)[2]/table/tbody/tr/td[1]/a') 也不起作用...
    【解决方案2】:

    好吧,我想通了……

    当文档中不存在时,浏览器会插入一个隐含的标签

    。 xpath 只会处理原始 HTML 字符串中存在的标签,所以我只是省略了 标签。

    旧的 xpath 查询:

    $xpath->query('//div[2]/table/tbody/tr/td[1]/a');
    

    新:

    $xpath->query('//div[2]/table/tr/td[1]/a');
    

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2012-08-28
      • 2019-01-29
      • 2010-10-06
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多