1

これを何と呼ぶか​​わからなかったので、すぐに詳しく説明します。

YQLコンソールを使用して構築しようとしているスクリーンスクレイパーがあります。クエリは、ユーザーにXMLまたはJSONの選択を提供します。コンソールのYQL>data>htmlアスペクトをターゲットにしており、出力形式としてXMLを選択しました。

私のYQLクエリ:

SELECT * FROM html WHERE url = "http://google.com"

これにより、XMLでのGoogle.comドキュメントツリーの読み取りが提供されます。この投稿に貼り付けるには出力が多すぎるため、リンクをクリックするだけです。

私の問題は、このリクエストからの出力を適切に表示するためにPHPでXMLツリーをトラバースすることにあります。foreachステートメント(またはその他のステートメント)を効果的に作成して、XML出力を効果的にスクレイプし、ドキュメントツリーを収集して、自分のニーズに合わせて再表示する方法がわかりません。

私のPHP:

$searchUrl = "google.com";

if(isset($_REQUEST['searchUrl'])) {
    $searchUrl = $_REQUEST['searchUrl'];
}

$query = "select * from html where url=\"http://".$searchUrl."\"";

$url = "http://query.yahooapis.com/v1/public/yql";

// Get Subcategory Article Data
$parameterData = "q=".urlencode($query);
$parameterData .= "&diagnostics=true";

// setup CURL 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $parameterData); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);

// send
$response = trim(urldecode(curl_exec($ch)));

// parse response
$xmlObjects = @simplexml_load_string($response);

foreach ($xmlObjects->diagnostics as $diagnostics) {
    echo "<a href=".$diagnostics->url." target='_blank'>".$diagnostics->url."</a>";
}
foreach ($xmlObjects->results as $result) {
    // here is where I would go echo $result->body or something along those lines
}

このタイプのフォーマットでXMLツリーをナビゲートするために次にどこを向くべきかを知る知識が不足しているため、この時点で少し困惑していると思います。XMLの後query>results>bodyで、残りのオブジェクトを収集し、それをpreタグまたはその性質のものでドキュメントに出力する場所がわかりません。

ユーザーが独自のドメインを入力するための入力フィールドを提供したいと思います。PHPはクエリを送信し、応答を繰り返し、HTMLの表示とデバッグのためにドキュメントツリーをユーザーに返します。

私は、RSSフィードなどの同じ内部構造を持つ多数の親要素を反復処理するという文脈でPHPとXMLに精通しています。この場合、1つの大きな応答オブジェクトと変動する内部構造を持つ動的XMLツリーを扱っています。

4

1 に答える 1

2

次のコードは、結果の本文を html ページとして表示します。

<?php

 // ... the code you posted in the question
 //     !without the diagnostics output!
 //     read comments of the answer to know why

?>
<html>
  <head>
  </head>
<?php
foreach ($xmlObjects->results as $result) {
    // asXml() will return the content of body as xml string
    echo $result->body->asXml();
    break;
}
?>
</html>

<head>YQL 経由でページの要素を取得しないため、ほとんどの場合、出力が乱雑に見えることに注意してください。

于 2013-01-14T21:59:37.167 に答える