2017-06-08 96 views
16

我使用YQL獲取一些用於讀取信息的html頁面。 從今天起我得到的返回信息。 「HTML表格不再支持見https://policies.yahoo.com/us/en/yahoo/terms/product-atos/yql/index.htm爲YQL使用條款」YQL:不再支持html表格

例如,在控制檯:https://developer.yahoo.com/yql/console/#h=select+ * +從+ HTML +,其中+ URL%3D%22http%3A% 2F%2Fwww.google.de%22

雅虎是否停止了此服務?有人知道雅虎發佈的一種消息嗎?我想知道這是否是一個簡單的錯誤或者他們是否真的停止了此服務......

所有文件仍然存在(HTML刮): https://developer.yahoo.com/yql/guide/yql-select-xpath.htmlhttps://developer.yahoo.com/yql/

前段時間我貼在YQL來自雅虎的論壇,現在這個不再存在了(或者至少我沒有找到它)。你怎麼能聯繫雅虎來了解這項服務是否真的停止了?

最好的問候, hebr3

+0

是的,也不適合我。他們給我們一個鏈接到「使用YQL條款 」頁面,但它沒有幫助。看起來YQL服務仍在運行 ,但由於錯誤消息指出「HTML表」查詢不再支持 。所以,我試圖找到另一種方法來從網頁上刮掉一個 HTML表格。也許有另一個YQL服務 可以幫助從網頁中提取表格,或者在YQL中有一些替代的查詢我可以嘗試。我想我必須閱讀YQL上的文檔才能找到答案。 – user1467483

+0

@ user1467483錯誤不是由於HTML表格造成的。它與名爲「html」的YQL表相關。像任何其他查詢語言一樣思考YQL - 信息存儲在表結構中。關於尋找YQL的替代方案,這沒有必要。你只需要找到一個替代的YQL表。看到我的回答 –

+0

我在GAE上使用YQL html表JSON輸出並使用lxml重構刮取。爲了不破壞現有代碼的接口,手頭有示例YQL輸出會很有用,尤其是JSON,這非常奇特。 [XML-to-JSON轉換文檔](https://developer.yahoo.com/yql/guide/xml_to_json.html)不是完整的規範(例如它是如何處理混合節點的?)。請分享樣本html與json,如[this one](https://stackoverflow.com/a/8763933/591336)。 – vicmortelmans

回答

1

非常感謝您的代碼。

它幫助我創建自己的腳本來閱讀我需要的頁面。我以前從未編程過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); 

?> 

的Javascript

$.ajax({ 
    url: "url of service", 
    dataType: "json", 
    data: { url: url, 
      xpath: "//*" 
      }, 
    type: 'GET', 
    success: function() { 
      }, 
    error: function(data) { 
      } 
}); 
+2

對於所有人來說,這可能不是一個解決方案,因爲它擁有自己的代理服務器,所有的請求都將在來自服務器的目標站點上。對於某些任務,這可能是不可取的。 YQL的優點在於,您可以訪問緩存(有時不是)版本的頁面,並將目標網站視爲期望的搜索索引流量。要模仿緩存版本來減少需要存儲的請求,有時候需要很多數據。它將會是不止一個屏幕尺寸的腳本。所以我認爲這不是一個通用的答案。 – SerrNovik

+1

我同意SerrNovik。這個解決方案是YQL的一個簡單替代方案,而不是使YQL按要求行事的方式。這是值得的貢獻,但不是對原始問題的合適答案。此外,許多開發人員使用YQL從等式中消除CORS。您的解決方案僅適用於同一主機上的文檔。 –

+0

是的,你沒事,我也喜歡YQL html表 - 但YQL停止服務沒有任何警告(至少我沒有收到),因此我的服務不再工作 - >從我的角度來看YQL不再可靠,我需要更換 – hebr3

0

同樣的問題在這裏。打破了我的腳本,花了一些時間來發現這張表不再被支持。還有其他的公共代理(Loading cross domain endpoint with jQuery AJAX),但它們都有一些限制,如果有太多的請求不像雅虎那樣緩存,可以被阻止。

14

看起來,雅虎在6/8/2017(根據我的錯誤日誌)確實已經停止支持html庫。目前還沒有任何官方聲明。

幸運的是,有一個YQL社區庫可以用來替代官方html庫,而對代碼庫進行很少的更改。請參閱htmlstring table in the YQL Console

將您的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

非常感謝您的提示。我只使用公共版本的YQL,因爲htmlstring我不得不使用一個身份驗證。在任何情況下,我完成雅虎YQL - 我現在有幾個問題,他們的穩定性,可用性等(雖然這是一個免費服務,我需要可靠性,這似乎並不存在)。我現在已經建立了自己的服務器並使用我自己的Web服務來獲取我需要的HTML頁面。 – hebr3

+0

我能夠使用htmlstring而無需身份驗證。我想知道你爲什麼不是。 PS,如果我的答案是合適的,請考慮將其標記爲接受的答案。 –

+0

我的錯誤,也適用於公共版本 – hebr3

0

即使YQL不支持HTML表了,我已經認識到,而不是使一個網絡調用和分析出來的結果是可能會打幾個電話。例如,之前我的電話是這樣的:

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

應該給我的信息,例如下面

enter image description here

現在,我不得不使用這兩個:

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"

..得到我想要的。我不知道爲什麼他們會在沒有明確列出回退的情況下棄用這樣的內容,但是您應該能夠以這種方式獲取您的數據。