为什么这个Xpath Query不能处理facebook应用程序页面的DOM?

时间:2011-03-02 00:21:34

标签: php facebook dom href xpath

我不明白为什么我的xpath查询返回第二个url的正确href而不是第一个url。 HTML代码看起来一样。它包含相同类型的结构。但不知何故没有返回href。 (我只是注释掉每个$ url来测试它)

$url = "http://apps.facebook.com/TexasHoldEmPoker/"; // this one does not work
//$url = "http://nu.nl"; // this one works

$response = wp_remote_get($url);
$data = $response['body'];
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->strictErrorChecking = false;
$href='';
if (!$dom->loadHTML($data))
{
    foreach (libxml_get_errors() as $error)
    {
    }
    libxml_clear_errors();
}
else
{
    $xpath = new DOMXPath($dom);
    $elements = $xpath->query("/html/head/link[@rel='shortcut icon']");

    if (!is_null($elements))
    {
        foreach ($elements as $element)
        {
            if ($element->getAttribute('href'))
            {
                $href = $element->getAttribute('href');
            }
        }
    }
}
echo $href;

所以我知道代码对于“nu.nl”工作正常,但不知何故不适用于facebook应用页面。我无法理解为什么结构是相同的。

P.S。 :完整代码:http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/sources/page.php

1 个答案:

答案 0 :(得分:2)

看看$dom->saveXML()

您会看到<link> - 元素是 body 的子元素,而不是像预期的那样 head

所以xpath应该是:

/html/body/link[@rel='shortcut icon']

//link[@rel='shortcut icon']

我猜不同的标记是解析器在尝试修复<noscript>内的非法<head>时的结果(包含此<noscript>后头部内的所有内容都已移至<body>