3

XPath を使用して評価式の結果を出力しようとすると、エラーが発生します。

$url = $xpath->evaluate('//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/>";
    }
?>
4

3 に答える 3

5

ノードに関する情報を取得するには、これを試してください。

 // 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-01T10:24:58.147 に答える
4

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;then の結果を 1 つだけ返しますが、型付きの結果として返すことはできないため、コードを次のように変更する必要があります。

$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-01T10:13:16.093 に答える
0

で試してみてください

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

これにより、ノードではなく、文字列として含まれるhref最初ののが得られますa$event

于 2012-05-01T15:10:31.433 に答える