2012-02-17 68 views
1

我试图从URL中获取输入框的值。我似乎在执行XPath时遇到了问题。PHP使用XPath刮 - html5问题?

被刮下的页面看起来像:

<!DOCTYPE html> 
<html lang="en"> 
    <head></head> 
    <body> 
     <div><span>Blah</span></div> 
     <div><span>Blah</span> Blah</div> 
     <div> 
      <form method="POST" action="blah"> 
       <input name="SomeName" id="SomeId" value="GET ME"/> 
       <input type="hidden" name="csrfToken" value="ajax:3575644127378754050" id="csrfToken-login"> 
      </form> 
     </div> 
    </body> 
</html> 

,我尝试分析它是这样的:

$Contents = file_get_contents("https://www.linkedin.com/uas/login"); 
$Selector = "//input[@id='csrfToken-login']/@value"; 
print_r($Selector); 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHtml($Contents); 
$xpath = new DOMXPath($dom); 
libxml_use_internal_errors(false); 
print_r($xpath->query($Selector)); 

NB:dump()只是包装print_r(),但增加了一些堆栈跟踪信息和格式。

输出是folllowws:

14:50:08 scraper.php 181: (Scraper->Test) 
//input[@id='csrfToken-login']/@value 

14:50:08 scraper.php 188: (Scraper->Test) 
DOMNodeList Object 
(
) 

这我假设意味着它无法找到它我选择相匹配的文件中什么?我已经尝试了一些变化,仅仅指刚看我是否能得到东西回:

/input/@value 
/input 
//input 
/div 

,我已经能够得到什么唯一的选择是从哪个/返回整个文档。

我在做什么错?

编辑:由于有些不能重现旧示例的问题,我用几乎相同的示例代替了它,它也演示了问题,但使用了公共URL(LinkedIn登录页面)。

有人建议,这是不可能的,因为HTML5上的解析器窒息 - (如同内部页面)任何人都有这方面的经验?

+1

你不能转储任何DOM实例。他们不暴露他们的财产。即使你使用了正确的XPath'// input [@ id ='SomeId']/@ value',dump()结果也会显示相同的空对象(尽管项目在那里)。 – Gordon 2012-02-17 14:00:39

+0

@Gordon谢谢 - 不知道那个... – Basic 2012-02-17 14:47:34

+0

我编辑了Q以包含使用LinkedIn登录页面的“工作”示例。 – Basic 2012-02-17 14:51:48

回答

2

如果您的选择器以单斜杠(/)开头,则表示从根开始的绝对路径。您需要使用双斜线(//),它可以选择所有匹配的元素,而不管它们的位置。

print_r对此不起作用。除了实际获得价值之外,代码中的一切都很好。 PHP中的列表类通常有一个名为length的属性,请检查它。

$Contents = file_get_contents("https://www.linkedin.com/uas/login"); 
$Selector = "//input[@id='csrfToken-login']/@value"; 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHtml($Contents); 
$xpath = new DOMXPath($dom); 
libxml_use_internal_errors(false); 
$b = $xpath->query($Selector); 
echo $b->item(0)->value; 
+0

或提供从根的完整路径 – Gordon 2012-02-17 14:05:04

+0

这似乎没有解决我的问题 - 看看更新的示例 – Basic 2012-02-17 14:52:56

+0

感谢Uku Loskit,工作完美。 – Basic 2012-02-18 23:44:25

1

DOMXPath看起来不错。

而对于使用XPath的后代或自身快捷//去输入标签

//input[@id='SomeId']/@value 
+0

谢谢,但我不认为这是唯一的问题 - 我已更新示例以指向LinkedIn登录页面,其中可以看到相同的行为。 – Basic 2012-02-17 15:04:55

0

我一直在您指定的LinkedIn登录页面,它是畸形的;即使您的缩减示例有一个未封闭的节点input。我对PHP的XPath实现一无所知,但我猜测没有直接的XPath API可以处理格式错误的文档。

顺便说一句,您的XPath是正确的。

您可能需要一个中间步骤,使用TagSoup在开始查询之前“良好地”形成源代码,或者Google为任何PHP特定的解决方案/实现“标记汤php”。

我希望这有助于
扎卡里