【问题标题】:How to use foreach() to iterate YQL XML and scrape HTML?如何使用 foreach() 来迭代 YQL XML 并抓取 HTML?
【发布时间】:2013-01-14 18:58:05
【问题描述】:

不知道该怎么称呼它,所以我会很快详细说明。

我正在尝试使用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&gt;results&gt;body 之后,我不确定从哪里收集剩余的对象,并将其以 pre 标记或类似性质的形式输出到我的文档中。

我想提供一个输入字段供用户输入自己的域,我的 PHP 将提交查询,迭代响应,并将文档树返回给用户以进行 HTML 查看和调试。

在迭代大量具有相同内部结构(如 RSS 提要或类似性质的东西)的父元素的上下文中,我熟悉 PHP 和 XML。在这种情况下,我正在处理一个动态 XML 树,具有一个大型响应对象和一个波动的内部结构。

【问题讨论】:

  • 您实际上不会得到所请求页面的 部分,YQL 查询只返回正文。因此,页面的样式表和 javascript 要求不可用。在大多数情况下,这会弄乱输出。但是,如果您想将正文作为字符串使用echo $result-&gt;body-&gt;asXml();(我假设您想要一个字符串)
  • 对,我对获取文档的&lt;head&gt; 并没有太大兴趣,只是获取正文。谢谢你的回复,我试试你的sn-p。

标签: php html xml yql


【解决方案1】:

以下代码会将结果正文显示为 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 获得页面的 &lt;head&gt; 元素,因此在大多数情况下,输出看起来会很混乱。

【讨论】:

  • 这是我在上面回复你时提到的link to the output,使用你的方法。
  • 是的,我告诉过没有脚本和样式的输出会看起来很乱。我用我的主页对其进行了测试,它看起来至少可读。 (因为使用了精细的 html 代码;))。此外,您应该删除诊断的输出或使用框架集之类的东西将输出与显示的页面分开。这是你想知道的吗?
  • 你确实把我推向了正确的方向。非常感谢您花时间帮助我!
  • 不客气。顺便说一句,我认为 YQL 是非常有趣的东西。喜欢它。祝你好运!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2020-05-02
  • 2021-01-26
  • 2021-04-17
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多