当我想用XPath打印一个计算表达式的结果时,我会出错。
$url =$xpath->计算(‘//a/@href’,$event);回波$url;
我有以下错误:可捕获的致命错误:类DOMNodeList的对象无法转换为字符串
我的代码:
<?php
// Get the HTML Source Code
$url='http://www.parisbouge.com/events/2012/05/01/';
$source = file_get_contents($url);
// DOM document Creation
$doc = new DOMDocument;
$doc->loadHTML($source);
// DOM XPath Creation
$xpath = new DOMXPath($doc);
// Get all events
$events = $xpath->query('//li[@class="nom"]');
// Count number of events
printf('There is %d events<br />', $events->length);
// List all events
for($i = 0; $i < ($events->length); $i++) {
$event = $events->item($i);
$url = $xpath->evaluate('//a/@href', $event);
$nom = $xpath->evaluate('//a/text()', $event);
$lieu = $xpath->evaluate('../li[@class="lieu"]/a/text()', $event);
echo "Result : $url $nom $lieu <br/>";
}
?>发布于 2012-05-01 10:24:58
尝试这个来获取有关节点的信息。
// List all events
for($i = 0; $i < ($events->length); $i++) {
$event = $events->item($i);
$url = $xpath->evaluate('.//a/@href', $event);
$nom = $xpath->evaluate('.//a/text()', $event);
$lieu = $xpath->evaluate('../li[@class="lieu"]/a/text()', $event);
$result = '';
if ($url->length > 0) {
$result .= $url->item(0)->value;
}
if ($nom->length > 0) {
$result .= $nom->item(0)->wholeText;
}
if ($lieu->length > 0) {
$result .= $lieu->item(0)->wholeText;
}
echo $result . "<br />";
//echo "Result : " . $url->item(0)->value . ' | ' . $nom->item(0)->wholeText . ' | ' . $lieu->item(0)->wholeText . "<br/>";
}不要忘记添加检查节点是否存在等。要检查是否存在节点,您可以检查nodeList长度或消除"Gordon“建议的错误。
发布于 2012-05-01 10:13:16
引用http://php.net/manual/de/domxpath.evaluate.php
如果可能,
返回一个类型化的结果,或者返回一个包含与给定XPath表达式匹配的所有节点的DOMNodeList。
因此,您的XPath显然会返回多个节点,这很可能是因为您使用了//,意思是“到处查找”。如果您执行echo $url->length;,您将看到有460项(不管传递的上下文节点)。
来自http://www.w3.org/TR/xpath/#path-abbrev
//para选择文档根的所有分段子代,从而选择同一文档中的所有分段元素,而上下文node.//para则选择上下文节点的para元素后代。
因此,您需要使用.//a/@href代替。这只会给出echo $url->length;的一个结果,但不能作为输入结果返回,所以您必须将代码更改为
$url = $xpath->evaluate('string(.//a/@href)', $event);
$nom = $xpath->evaluate('string(.//a)', $event);
$lieu = $xpath->evaluate('string(../li[@class="lieu"]/a)', $event);还请注意,您可以缩短DOMDocument的创建和加载到
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->loadHTMLFile('http://www.parisbouge.com/events/2012/05/01/');对libxml_use_internal_errors的调用将阻止任何解析错误。
发布于 2012-05-01 15:10:31
试着
$url = $xpath->evaluate('string(.//a/@href)', $event); echo $url ;这将为您提供包含在href中的第一个a的字符串,而不是一个节点。
https://stackoverflow.com/questions/10396245
复制相似问题