PHP使用XPath刮 - html5问题?
问题描述:
我试图从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上的解析器窒息 - (如同内部页面)任何人都有这方面的经验?
答
如果您的选择器以单斜杠(/
)开头,则表示从根开始的绝对路径。您需要使用双斜线(//
),它可以选择所有匹配的元素,而不管它们的位置。
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;
答
我一直在您指定的LinkedIn登录页面,它是畸形的;即使您的缩减示例有一个未封闭的节点input
。我对PHP的XPath实现一无所知,但我猜测没有直接的XPath API可以处理格式错误的文档。
顺便说一句,您的XPath是正确的。
您可能需要一个中间步骤,使用TagSoup在开始查询之前“良好地”形成源代码,或者Google为任何PHP特定的解决方案/实现“标记汤php”。
我希望这有助于
扎卡里
你不能转储任何DOM实例。他们不暴露他们的财产。即使你使用了正确的XPath'// input [@ id ='SomeId']/@ value',dump()结果也会显示相同的空对象(尽管项目在那里)。 – Gordon 2012-02-17 14:00:39
@Gordon谢谢 - 不知道那个... – Basic 2012-02-17 14:47:34
我编辑了Q以包含使用LinkedIn登录页面的“工作”示例。 – Basic 2012-02-17 14:51:48