YQL: таблица html больше не поддерживается
Я использую YQL для получения некоторых html-страниц для чтения информации из него.
С сегодняшнего дня я получаю сообщение возврата "html-таблица больше не поддерживается. См. https://policies.yahoo.com/us/en/yahoo/terms/product-atos/yql/index.htm для условий использования YQL"
Пример в консоли: https://developer.yahoo.com/yql/console/#h=select+ * + from + html + где + url% 3D% 22http% 3A% 2F% 2Fwww. google.de% 22
Неужели Yahoo остановила эту услугу? Кто-нибудь знает какое-то объявление от Yahoo? Мне интересно, это просто ошибка или действительно ли они остановили эту службу...
Вся документация все еще существует (html scraping):
https://developer.yahoo.com/yql/guide/yql-select-xpath.html,
https://developer.yahoo.com/yql/
Некоторое время назад я опубликовал на форуме YQL от Yahoo, теперь этого больше не существует (или, по крайней мере, я его не нахожу). Как вы можете связаться с Yahoo, чтобы узнать, действительно ли эта служба остановилась?
С уважением,
hebr3
Ответы
Ответ 1
Большое спасибо за ваш код.
Это помогло мне создать свой собственный script, чтобы прочитать те страницы, которые мне нужны. Я никогда не программировал PHP раньше, но с вашим кодом и мудростью Интернета я мог бы изменить ваш script на мои потребности.
PHP
<?
header('Access-Control-Allow-Origin: *'); //all
$url = $_GET['url'];
if (substr($url,0,25) != "https://www.xxxx.yy") {
echo "Only https://www.xxxx.yy allowed!";
return;
}
$xpathQuery = $_GET['xpath'];
//need more hard check for security, I made only basic
function check($target_url){
$check = curl_init();
//curl_setopt( $check, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));
//curl_setopt($check, CURLOPT_INTERFACE, "xxx.xxx.xxx.xxx");
curl_setopt($check, CURLOPT_COOKIEJAR, 'cookiemon.txt');
curl_setopt($check, CURLOPT_COOKIEFILE, 'cookiemon.txt');
curl_setopt($check, CURLOPT_TIMEOUT, 40000);
curl_setopt($check, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($check, CURLOPT_URL, $target_url);
curl_setopt($check, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($check, CURLOPT_FOLLOWLOCATION, false);
$tmp = curl_exec ($check);
curl_close ($check);
return $tmp;
}
// get html
$html = check($url);
$dom = new DOMDocument();
@$dom->loadHTML($html);
// apply xpath filter
$xpath = new DOMXPath($dom);
$elements = $xpath->query($xpathQuery);
$temp_dom = new DOMDocument();
foreach($elements as $n) $temp_dom->appendChild($temp_dom->importNode($n,true));
$renderedHtml = $temp_dom->saveHTML();
// return html in json response
// json structure:
// {html: "xxxx"}
$post_data = array(
'html' => $renderedHtml
);
echo json_encode($post_data);
?>
Javascript
$.ajax({
url: "url of service",
dataType: "json",
data: { url: url,
xpath: "//*"
},
type: 'GET',
success: function() {
},
error: function(data) {
}
});
Ответ 2
Похоже, что Yahoo действительно закончила свою поддержку библиотеки html по состоянию на 6/8/2017 (согласно моим журналам ошибок). По-видимому, официального объявления об этом пока нет.
К счастью, существует библиотека сообщества YQL, которую можно использовать вместо официальной библиотеки html с небольшими изменениями в вашей кодовой базе. См. Таблицу htmlstring в консоли YQL.
Измените свой запрос YQL на ссылку htmltable вместо html и включите среду сообщества в свой запрос REST. Например:
// Old code
var site = "http://www.test.com/foo.html";
var yql = "select * from html where url='" + site + "' AND xpath='//div'";
var resturl = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json";
// New code
var site = "http://www.test.com/foo.html";
var yql = "select * from htmlstring where url='" + site + "' AND xpath='//div'";
var resturl = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
Ответ 3
Такая же проблема. Сломал мой script и потребовалось некоторое время, чтобы узнать, что эта таблица больше не поддерживается. Существуют другие общедоступные прокси (Загрузка конечной точки междоменного домена с помощью jQuery AJAX), но все они имеют некоторые ограничения и могут быть заблокированы, если в ней слишком много запросов, в отличие от yahoo кэш.
Ответ 4
Несмотря на то, что YQL больше не поддерживает таблицу html, я понял, что вместо того, чтобы делать один сетевой вызов и разбирать результаты, можно сделать несколько вызовов. Например, мой вызов раньше будет выглядеть так:
select html from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"
Что должно дать мне такую информацию ниже
![введите описание изображения здесь]()
Теперь мне придется использовать эти два:
select title from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"
select description from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"
.. получить то, что я хочу. Я не знаю, почему они откажутся от чего-то вроде этого без четкого перечисления, но вы должны иметь возможность получить ваши данные таким образом.