YQL:不再支持html表

heb*_*br3 18 yql

我使用YQL获取一些html页面来读取信息.从今天起,我收到了返回消息"不再支持html表.有关YQL使用条款,请参阅https://policies.yahoo.com/us/en/yahoo/terms/product-atos/yql/index.htm "

控制台中的示例:https://developer.yahoo.com/yql/console/#h=select+*+ from + html +其中+ url%3D%22http%3A%2F%2Fwww.google.de%22

雅虎是否停止了这项服务?有人知道雅虎的某种声明吗?我想知道这只是一个错误,还是他们真的停止了这项服务......

所有文档仍然存在(html抓取):https: //developer.yahoo.com/yql/guide/yql-select-xpath.html,https : //developer.yahoo.com/yql/

前一段时间我在雅虎的YQL论坛上发帖,现在这个不存在了(或者至少我找不到它).您如何联系雅虎以了解此服务是否真的停止了?

最好的问候,hebr3

bla*_*o_x 18

看起来截至2017年6月8日雅虎确实已经结束了对html库的支持(根据我的错误日志).似乎还没有任何官方公告.

幸运的是,有一个YQL社区库可以代替官方的html库,只需对代码库进行一些更改.请参阅YQL控制台中htmlstring表.

将您的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 = "https://query.yahooapis.com/v1/public/yql?q="
    + encodeURIComponent(yql) + "&format=json";
Run Code Online (Sandbox Code Playgroud)

 

/*/ 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";
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你的提示.我只使用YQL的公共版本,对于htmlstring,我必须使用一个带有身份验证的.无论如何我完成了Yahoo YQL - 我现在遇到了几个问题,包括它们的稳定性,可用性等等(尽管它是免费服务,我需要可靠性,但这似乎并不存在).我现在设置了自己的服务器并使用我自己的Web服务来获取我需要的html页面. (3认同)
  • htmlstring事情随机工作,有时工作,有时失败 (2认同)

heb*_*br3 0

非常感谢您的代码。

它帮助我创建了自己的脚本来阅读我需要的那些页面。我以前从未编写过 PHP,但是通过您的代码和互联网的智慧,我可以根据我的需要更改您的脚本。

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); 

?>
Run Code Online (Sandbox Code Playgroud)

JavaScript

$.ajax({
    url: "url of service",
    dataType: "json", 
    data: { url: url,
            xpath: "//*"
          },
    type: 'GET',
    success: function() {
             },
    error: function(data) {
           }
}); 
Run Code Online (Sandbox Code Playgroud)

  • 这可能不是适合所有人的解决方案,因为拥有自己的代理,所有请求最终都会到达来自您服务器的目标站点。对于某些任务来说,这可能是不可取的。YQL 的美妙之处在于,您可以访问缓存(有时不是)的页面版本,并且到目标站点,这将看起来像所需的搜索索引流量。为了模仿缓存版本以减少您必须存储的请求,有时需要存储相当多的数据。而且这将是不止一种屏幕尺寸的脚本。所以我认为这不是一个通用的答案。 (2认同)