web-dev-qa-db-fra.com

YQL: la table HTML n'est plus prise en charge

J'utilise YQL pour obtenir des pages html permettant de lire des informations . Depuis aujourd'hui, je reçois le message de retour "La table html n'est plus prise en charge. Voir https://policies.yahoo.com/us/en /yahoo/terms/product-atos/yql/index.htm pour les conditions d'utilisation de YQL "

Exemple dans la console: https://developer.yahoo.com/yql/console/#h=select+ * + de + html + où + url% 3D% 22http% 3A% 2F% 2Fwww.google.de % 22

Yahoo a-t-il arrêté ce service? Est-ce que quelqu'un connaît une sorte d'annonce de Yahoo? Je me demande s'il s'agit simplement d'un bug ou s'ils ont vraiment arrêté ce service ...

Toute la documentation est toujours là (grattage html): https://developer.yahoo.com/yql/guide/yql-select-xpath.html , https: // developer. yahoo.com/yql/

Il y a quelque temps, j'ai posté dans un forum YQL de Yahoo, maintenant celui-ci n'existe plus (ou du moins je ne le trouve pas). Comment pouvez-vous contacter Yahoo pour savoir si ce service s'est vraiment arrêté?

Cordialement, Hebr3

18
hebr3

Merci beaucoup pour votre code.

Cela m'a aidé à créer mon propre script pour lire les pages dont j'ai besoin. Je n'avais jamais programmé PHP auparavant, mais avec votre code et la sagesse d'Internet, je pouvais modifier votre script selon mes besoins.

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) {
           }
}); 
0
hebr3

Il semblerait que Yahoo ait effectivement mis fin à la prise en charge de la bibliothèque html à compter du 6/8/2017 (selon mes journaux d'erreur). Il semble qu'il n'y ait pas encore d'annonce officielle à ce sujet.

Heureusement, il existe une bibliothèque de communauté YQL qui peut être utilisée à la place de la bibliothèque html officielle avec peu de modifications de votre base de code. Voir la table htmlstring dans la console YQL .

Changez votre requête YQL pour référencer htmltable au lieu de html et incluez l'environnement de la communauté dans votre requête REST. Par exemple:

/*/ Old code /*/

var site = "http://www.test.com/foo.html";

var yql = "select * from html where url='" + site + "' AND xpath='//div'";

var resturl = "https://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 = "https://query.yahooapis.com/v1/public/yql?q="
    + encodeURIComponent(yql) + "&format=json"
    + "&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
18
blakeo_x

Même si YQL ne prend plus en charge la table html, je me suis rendu compte qu'au lieu de passer un appel réseau et d'analyser les résultats, il est possible de passer plusieurs appels. Par exemple, mon appel précédent ressemblerait à ceci:

select html from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"

Ce qui devrait me donner l'information ci-dessous

 enter image description here

Maintenant, je devrais utiliser ces deux:

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"

.. d'obtenir ce que je veux. Je ne sais pas pourquoi ils déprécieraient quelque chose comme cela sans un repli clairement indiqué, mais vous devriez pouvoir obtenir vos données de cette façon.

0
BruceWayne