2011-03-02 65 views
1

我不明白为什么我的xpath查询返回第二个url但不是第一个url的正确href。 HTML代码看起来一样。它包含相同的结构。但不知何故,没有返回href。 (我只是注释掉中的每一个$网址的测试吧)为什么此Xpath查询不能在Facebook应用程序页面的DOM上工作?

$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

因为这两个页面都是XHTML,您是否尝试过使用'DOMDocument :: loadXML()'而不是'loadHTML()'? – Phil 2011-03-02 00:53:43

+0

当我尝试loadxml没有2工作。不过,我开始怀疑我需要玩命名空间,但所有尝试失败。 – edelwater 2011-03-02 01:03:38

+0

So $ xmlding = new SimpleXMLElement($ dom-> saveXML());使用相同的查询,而不是两种情况下都不显示任何内容 – edelwater 2011-03-02 01:19:11

回答

2

看看$dom->saveXML()

你会看到<link> - 元素是身体,而不是的孩子像预期。

所以XPath的应该是:

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

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

我想不同的标记是解析器试图解决非法<noscript>内的<head>(里面的东西时,结果头后,包括这<noscript>已被移动到<body>

+0

这很奇怪,当我做页面的“查看源代码”时,我清楚地看到Facebook应用页面HEAD中的链接,但显然这里发生了一些奇怪的事情。谢谢!! (我将链接在代码如上所以你得到的信用) – edelwater 2011-03-02 01:42:35

+0

直到下一个问题:我如何从http://www.daylife.com/提取它? – edelwater 2011-03-02 02:28:36

+1

'// link [translate(@ rel,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='快捷图标']' – 2011-03-02 17:49:41

相关问题