0

似たような質問がいくつか寄せられていることは知っていますが、私はここで立ち往生しています。これを支援するための良いチュートリアルが見つかりません。しかし、私がやりたいことは非常に基本的なことです。Stackoverflow.comでH1の「上位の質問」を取得したいとします。Chromeを使用してXpathを取得します。次のようになります。

//*[@id="h-top-questions"]

だから私の質問は; どうすればこれをエコーできますか?ネット全体からのコードスニペットを使用して、私はこれを手に入れました:

<?php
$curl = curl_init('http://stackoverflow.com/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10');
$html = curl_exec($curl);
curl_close($curl);

if (!$html) {
    die("something's wrong!");
}

//var_dump(strlen($data));

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$headerh1 = $xpath->query('//*[@id="h-top-questions"]');

foreach($headerh1 as $match) {
    print_r($match);    
}
?>

これは出力するだけだと思い<h1 id="h-top-questions">Top Questions</h1>ました。しかし、代わりに私は得 DOMElement Object ( ) ます。

誰か助けてもらえますか?私はこれを学ぼうとしています。

4

2 に答える 2

1

queryメソッドの結果によってDOMNodeList要素を取得します。DOMNodeList item($ index)メソッドを介してノードにアクセスしてみてください。

于 2012-05-21T08:53:00.333 に答える
0

この方法でオブジェクトのコンテンツを表示するには、オブジェクトを文字列に変換する必要があります。これを実行したい場合は、単純にecho/ printitにするか、次のような文字列にキャストすることができます。

$string = (string) $object;

オブジェクトが文字列に変換されると、PHPはその__toString()メソッドを呼び出します。残念ながら、DOMElementオブジェクトはそれを定義しないため、それを文字列に変換しようとすると、次のエラーが発生します。

キャッチ可能な致命的なエラー:クラスDOMElementのオブジェクトを文字列に変換できませんでした...

この特定のシナリオでは、少量のコードでこれを実行できるようにする貧弱な回避策があります。これは、関数を使用してSimpleXMLを介してバウンスすることです。クラスはそれをに変換するメソッドを定義しているためです。 XML文字列。だからあなたはこれを行うことができます:simplexml_import_dom()SimpleXMLElementasXML()

foreach($headerh1 as $match) {
  $xml = simplexml_import_dom($match);
  echo $xml->asXML();
}

ただし、この特定のインスタンスでは、これにより次の出力が生成されます。

<h1 id="h-top-questions">&#13;
        Top Questions    &#13;
     </h1>

ご覧のとおり、元のソースコードにはなかった余分なHTMLエンティティがそこにリークしています。これは、DOMとSimpleXMLの間のどこかで発生しました。

これを回避するために、次のことが可能になります。

  • 出力を。に渡しますhtml_entity_decode()。これは、無効なXML / HTML出力をもたらす可能性があるため、優れたオプションではありません。
  • 独自の関数をロールして、DOMElementを文字列に変換します。これは非常に複雑であり、完全なノードリストを正常に取得するには、多くのレベルを繰り返す必要がある可能性があるため、これも優れたオプションではありません。

ただし、ここで覚えておくべきことの1つは、実行していることには、テストとデバッグ以外の実用的なアプリケーションがあまりないということです。部分的なドキュメントを実際に出力したいとは思わないでしょう。

于 2012-05-21T09:31:14.643 に答える