簡體   English   中英

PHP - DOMXpath - 獲取結果

[英]PHP - DOMXpath - Get the result

當我想用XPath打印evaluate表達式的結果時,我有錯誤。

$ url = $ xpath-> evaluate('// a / @ href',$ event); echo $ 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/>";
    }
?>

嘗試此操作以獲取有關節點的信息。

 // 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 lenght或抑制“Gordon”建議的錯誤。

引用http://php.net/manual/de/domxpath.evaluate.php

如果可能,返回類型化結果或包含與給定XPath表達式匹配的所有節點的DOMNodeList。

所以你的XPath顯然會返回多個節點,這可能源於你使用//這意味着“無處不在”。 如果你echo $url->length; 你會看到有460個項目(無論傳遞的上下文節點)。

來自http://www.w3.org/TR/xpath/#path-abbrev

  • //para選擇文檔根的所有para后代,從而選擇與上下文節點相同的文檔中的所有para元素
  • .//para選擇上下文節點的para元素后代

所以你需要使用.//a/@href代替。 這將只給出echo $url->length; 1個結果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的調用將抑制任何解析錯誤。

試試吧

$url = $xpath->evaluate('string(.//a/@href)', $event); echo $url ;

這將為您提供$event包含的第a href作為字符串,而不是節點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM