不知道该怎么称呼,所以我会尽快详细说明。
我正在尝试使用YQL控制台构建一个屏幕抓取工具。该查询为用户提供XML或JSON选项。我的目标是控制台的YQL> data> html方面,并选择XML作为我的输出格式。
我的YQL查询:
这将为您提供XML格式的Google.com文档树的读数。要粘贴到此帖子中的输出太多,因此只需点击该链接即可。
我的问题来自于使用PHP遍历XML树以正确显示此请求的输出。我不知道如何有效地创建foreach语句(或任何其他语句)来有效地抓取XML输出并收集Document树并根据自己的需要重新显示它。
我的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将提交查询,迭代响应,并将Document树返回给用户以进行HTML查看和调试。
我在迭代大量父元素的过程中熟悉PHP和XML,这些元素具有相同的内部结构,如RSS feed或其他类似的东西。在这种情况下,我正在处理动态XML树,其中包含一个大的响应对象和一个波动的内部结构。
答案 0 :(得分: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>
请注意,由于您不会通过YQL获取页面的<head>
元素,因此在大多数情况下输出看起来会很混乱。