YQL:不再支持html表,替代解决方案

时间:2017-06-08 17:02:23

标签: yql

关于这个问题的答复,我没有太多的声誉可以在那里发布 YQL: html table is no longer supported

昨天我遇到了同样的问题 我认为雅虎不会退回这个功能(我想在购买Verizon之后)。 我在网站上使用了很少使用YQL的脚本,但是在三天之后所有脚本都崩溃了,我很失望。 我在一周前才知道yql(我认为它是一个很棒的功能),如果我知道它不再受支持,我会想到另一种变体(我认为大公司必须先警告过,然后删除功能)。
 我在使用javascript时遇到了CORS问题,当需要从另一个站点提取一些数据时(通常我使用curl来提取html)。 所以我用另一种方式解决了这个问题。 写简单的php xpath解析器,并发布在我的网站上。您可以通过ajax调用的GET请求提取部分html。 你也可以添加json return,我没有,因为我不需要这个功能。

它的php后端代码:

//gethtmldata.php backend file
<? 
header("Access-Control-Allow-Origin: https://allowsite.com");
//header('Access-Control-Allow-Origin: *'); //all
//echo 'hello';
$url = $_GET['url'];
$xpathQuery = $_GET['xpath'];
/*
//diagnostic block
echo '<pre>';
echo $_SERVER['HTTP_USER_AGENT'].PHP_EOL;
echo $_SERVER['REMOTE_HOST'].PHP_EOL;
echo $_SERVER['REMOTE_ADDR'].PHP_EOL;
echo $url.PHP_EOL;
echo $xpathQuery.PHP_EOL;
echo '</pre>';
*/
//need more hard check for security, I made only basic
if( isset($_GET['url']) && isset($_GET['xpath'])){
    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;

    } 
    $html = check($url);
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $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();

    echo '<result>';
        print_r($renderedHtml);
    echo '</result>';
}
?>

通过项目中的javascript调用

//js frontend

<div id="part-html-container"></div>
<script>
        var source = "https://www.your-target-site.com/";
        var xpath = '//div[contains(@class,"product-rating")]'; //standart xpath query
        var clean_space = source.replace(/ /g, "%20");

$.ajax({
    type: 'GET',
    url: "https://site-where-script-situated.com/embedding/gethtmldata.php?url="+encodeURIComponent(clean_space)+"&xpath="+encodeURIComponent(xpath)+"",
    dataType: 'html',
    success: function(data){
        $('#part-html-container').html(data);
        console.log('success');
    }
});
</script>

所以,你需要: - 服务器或托管与PHP; - ssl(如果你的项目网站使用它); - 这个PHP脚本

0 个答案:

没有答案