Как использовать foreach() для итерации YQL XML и очистки HTML?
Не был уверен, как это назвать, поэтому я быстро уточню.
У меня есть скребок экрана, который я пытаюсь построить, используя консоль YQL. Запрос предоставляет пользователю выбор XML или JSON. Я ориентируюсь на аспект консоли YQL>data>html и выбрал XML в качестве выходного формата.
Мой YQL-запрос:
Это обеспечит вам считывание дерева документов Google.com в формате XML. Слишком большой вывод для вставки в этот пост, поэтому просто нажмите на ссылку.
Моя проблема связана с обходом дерева XML с помощью PHP для правильного отображения результатов этого запроса. Я не знаю, как эффективно создать оператор 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 с таким форматом. После query>results>body
в XML я не уверен, куда обратиться, чтобы собрать оставшиеся объекты и вывести его в мой документ в pre
тег или что-то в этом роде.
Я хотел бы предоставить пользователям поле ввода для ввода своего собственного домена, и мой PHP отправит запрос, перебирает ответ и возвращает дерево документа пользователю для просмотра и отладки HTML.
Я знаком с PHP и XML в контексте итерации большого количества родительских элементов с такой же внутренней структурой, как RSS-канал или что-то в этом роде. В этом случае я имею дело с динамическим деревом XML, с одним большим объектом ответа и колеблющейся внутренней структурой.
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>
Обратите внимание, что, поскольку вы не получите <head>
Элемент страницы через YQL вывод будет в большинстве случаев выглядеть беспорядочным.