YQL WebService

YQL簡介

李威毅 2016/10/11 17:24:47
1233







主題

YQL簡介

文章簡介

利用即時氣象當作範例,簡單介紹何謂YQL

作者

李威毅

版本/產出日期

V1.0/2016.10.07




1. 前言

現在的網路資訊十分發達,許多網頁都會提供各式各樣的資訊給使用者,但是許多網頁所提供的資訊,都無法像Web Service 或 Web API般可以方便的取得想要擷取的資料。在國外的許多入口網站都有提供各種API或是網路服務,其中YAHOO提供了一種名為YQL的網頁資訊查詢服務,來讓使用者,方便利用Web Service的模式,來擷取網路資源


2. 目的

以擷取中央氣象局的即時氣象為案例,稍微讓讀者能理解什麼是YQL以及YQL的基本操作方法


3. 開始前準備

必須事前準備的工具如下

(1) 開發工具visual studio

(2)瀏覽器(IE、火狐或Chrome都可 )


4. 實作

(1)產生YQL WebService服務網址

1.前往YQL的服務網址https://developer.yahoo.com/yql/


2.編輯YQL語法。以本次為範例網站中央氣象局為案例

中央氣象局網址:

http://www.cwb.gov.tw/V7/forecast/f_index.htm

還有我們的目標為新北市的即時天氣,因此必須從此網站找到新北市即時天氣所在的HTML標籤語法

因此我們的YQL語法應為

select * from html where url='http://www.cwb.gov.tw/V7/forecast/f_index.htm'

and xpath='//tr[@id="TaipeiList"]'

YQL綠色的部分為欲擷取資料之網址,紅色部分為欲擷取資料之節點(XPATH)。

接下來回到YQL的服務網址,

上圖說明:(1)選擇需要使用的資料格式,在本次案例裡所需要的是XML,因此選XML。(2)把YQL語法貼於此。(3)測試語法是否可行,而(4)是測試結果。(5)所需資料的WebService網址,WebService結果如下圖


(2)C# 程式實作

接下來我們將用C#來撰寫程式,利用.Net 中WebClient類別來取得XML,並加以擷取,取得時天期的Img 標籤,以下是範例程式

string url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20%20where%20url%3D'http%3A%2F%2Fwww.cwb.gov.tw%2FV7%2Fforecast%2Ff_index.htm'%20and%20xpath%3D'%2F%2Ftr%5B%40id%3D%22TaipeiList%22%5D'&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";

WebClient client = new WebClient();

client.Encoding = System.Text.Encoding.UTF8;

//ws.Encoding(Encoding.Unicode);

string tempXml = client.DownloadString(url);

string xmlStr = client.DownloadString(url).Replace(@"<div class=""spic""><a href=""/V7/forecast/taiwan/New_Taipei_City.htm""", @"<div class=""spic""><Flash").Replace("</a></div>", "</Flash></div>");

xmlStr = xmlStr.Replace(@"<td width=""50%""><a href=""/V7/forecast/taiwan/New_Taipei_City.htm"">", "<weather>").Replace(@"</a></td><td width=""18%"">", @"</weather><td width=""18%"">");

XmlDocument doc = new XmlDocument();

doc.LoadXml(xmlStr);

XmlNodeList nodelist = doc.SelectNodes("//Flash");

StringBuilder weatherImgStr = new StringBuilder();

for (int i = 0; i < nodelist.Count; i++)

{

var temp = nodelist[i].InnerXml;

weatherImgStr.Append(temp.ToString());

}

model.WeatherImg = weatherImgStr.ToString().Replace("/V7/", "http://www.cwb.gov.tw/V7/");

nodelist = doc.SelectNodes("//weather");

weatherImgStr = new StringBuilder();

for (int i = 0; i < nodelist.Count; i++)

{

var temp = nodelist[i].InnerText;

weatherImgStr.Append(temp.ToString());

}

model.WeatherStr = weatherImgStr.ToString().Replace("~", " ~ ");


其中變數model.WeatherImg是我們所需要的即時天氣的Html img標籤,model.WeatherStr則是顯示目前的溫度,直接傳到前端顯示即可

顯示結果如下圖


5. 參考來源

●透過Jquery利用YQL擷取中央氣象局網頁內容

https://dotblogs.com.tw/andytsao701/archive/2014/10/11/146894.aspx

李威毅