无法通过xpath访问具有多个名称空间的xhtml文档中的节点

时间:2012-07-16 09:24:06

标签: php xpath curl namespaces

好的,所以我试图用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命名空间的分页的xpath应该是正确的)。我应该注册所有名称空间并在xpath查询中以某种方式使用它们吗?

祝你好运, AB

//问题更新//

这是我要解析的页面的一部分: (我想要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>

doctype是:

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

如果这有什么不同......

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好吧我明白了......

浏览器将插入隐式标记&lt; tbody&gt;当它不在文件中时。 xpath只处理原始HTML字符串中的标记,所以我只是省略了&lt; tbody&gt;标签

旧的xpath查询:

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

新:

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