Почему этот запрос Xpath не работает на DOM-страницах приложений Facebook? - PullRequest
1 голос
/ 02 марта 2011

Я не понимаю, почему мой запрос xpath возвращает правильный href для второго URL, а не для первого URL.HTML-код выглядит так же.Он содержит такую ​​же структуру.Но почему-то не возвращается.(Я просто закомментирую каждый из $ 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.Я не могу понять, почему, поскольку структура одинакова.

ps: полный код здесь: http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/sources/page.php

1 Ответ

2 голосов
/ 02 марта 2011

Взгляните на $dom->saveXML().

Вы увидите, что <link> -элемент является потомком тела , а не головы , как ожидалось.

Так что xpath должен быть:

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

или

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

Я полагаю, что другая разметка является результатом синтаксического анализа при попытке исправить недопустимый <noscript> внутри <head> (все, что было в голове после, включая этот <noscript>, было перемещено в <body>)

...