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"

.. получить то, что я хочу. Я не знаю, почему они откажутся от чего-то вроде этого без четкого перечисления, но вы должны иметь возможность получить ваши данные таким образом.