• 应用范例:解析 Yahoo 奇摩股市的各档股票资讯HtmlAgilityPack


    笔者认为这应该是很多撰写股市资料收集的应用程式的主要标的,若是要由证交所取得资料授权可能要一笔费用,但是由 Yahoo 奇摩股市中解析并读取资料是免费的,只是 Yahoo 奇摩股市的 HTML 结构长久以来都是鬆散型的,不像 W3C 是 XHTML(之前使用 HTML Agility Pack 读取是要展示它的功能),所以要剖析它需要花不少脑力,现在我们可以使用 HTML Agility Pack 来将这个工作简化。

    在 Yahoo 奇摩股市中,一个个股的资讯是这样:

    而它的 HTML 结构则是:

    因此如果我们要使用 XPath 来解读它,则需要先使用下列 XPath 先到达上层 table 的位置,再往下取得 HTML 中的内容:

    [XPath]

    1. /html[1]/body[1]/center[1]/table[2]/tr[1]/td[1]/table[1]  

    因此我们可以撰写下列的程式码:

    [c-sharp:showcolumns] view plaincopy
    ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
    1. using System.Net;  
    2. using System.IO;  
    3. using HtmlAgilityPack;  
    4.   
    5. public static void Main(string[] args)  
    6. {  
    7.     // 下载 Yahoo 奇摩股市资料 (范例为 2317 鸿海)  
    8.     WebClient client = new WebClient();  
    9.     MemoryStream ms = new MemoryStream(client.DownloadData(  
    10. "http://tw.stock.yahoo.com/q/q?s=2317"));  
    11.   
    12.     // 使用预设编码读入 HTML  
    13.     HtmlDocument doc = new HtmlDocument();  
    14.     doc.Load(ms, Encoding.Default);  
    15.   
    16.     // 装载第一层查询结果  
    17.     HtmlDocument docStockContext = new HtmlDocument();  
    18.   
    19.     docStockContext.LoadHtml(doc.DocumentNode.SelectSingleNode(  
    20. "/html[1]/body[1]/center[1]/table[2]/tr[1]/td[1]/table[1]").InnerHtml);  
    21.   
    22.     // 取得个股标头  
    23.     HtmlNodeCollection nodeHeaders =  
    24.  docStockContext.DocumentNode.SelectNodes("./tr[1]/th");  
    25.     // 取得个股数值  
    26.     string[] values = docStockContext.DocumentNode.SelectSingleNode(  
    27. "./tr[2]").InnerText.Trim().Split('/n');  
    28.     int i = 0;  
    29.   
    30.     // 输出资料  
    31.     foreach (HtmlNode nodeHeader in nodeHeaders)  
    32.     {  
    33.         Console.WriteLine("Header: {0}, Value: {1}",   
    34. nodeHeader.InnerText, values[i].Trim());  
    35.         i++;  
    36.     }  
    37.   
    38.     doc = null;  
    39.     docStockContext = null;  
    40.     client = null;  
    41.     ms.Close();  
    42.   
    43.     Console.WriteLine("Completed.");  
    44.     Console.ReadLine();  
    45. }  

    读取 Yahoo 奇摩个股资料的程式码(专案类型:主控台应用程式)

    NOTE

    目前 HTML Agility Pack 预设编码应是法文编码,所以如果是读取中文 HTML 内容的话,无法直接使用 HtmlDocument.LoadHtml() 方法,而要透过 MemoryStream 使用 HtmlDocument.Load() 方法,才可以指定中文的编码。

    有了这个读取程式后,笔者认为可以做的事就很多了,像是将它以 XSLT 转换成不同的 HTML 来显示,或是存到资料库中做其他的工作(分析或是图表输出等都可以做到)。

    由上列程式可以看出,HTML Agility Pack 的使用其实就和 XML DOM 的使用差不了多少,而且也不用再去写不具亲和力的 Regular Expression 的指令,就可以轻鬆的使用 XPath 来解析 HTML,就算是鬆散的 HTML 也可以解析。
    NOTE

    虽然 HTML Agility Pack 可以解析成功鬆散的 HTML 文件内容,但是请注意,鬆散的 HTML 内容可能会造成 HtmlNode 不是预期的结果,或是在解析表格时,档头和内容不同步的现象,这个部份开发人员可能需要多加注意。

    NOTE

    HTML Agility Pack 也可以用来动态产生 HTML 的内容,就如同 XmlDocument 产生 XML 文件内容一样,它也有像是 CreateElement()、CreateAttribute()、CreateComments() 与 CreateTextNode() 等方法,其使用方式与 XmlDocument 不多,因此笔者在此就不赘述,请参考: http://msdn.microsoft.com/zh-tw/library/t058x2df.aspx

    WARNING

    本范例程式仅以 Yahoo 奇摩作为范例标的,实际上若要应用时请注意其内容授权合约与免责条款,笔者仅以此范例展示 HTML Agility Pack 的功能,并不代表使用此范例即等同获得 Yahoo 奇摩的内容授权,若要引用则请注意是否有合法的内容授权,如因引用范例程式而导致侵权问题,一切责任由引用者自负。


    辅助工具
    HTML Agility Pack 本身有提供一个 HAP Explorer 的工具,可以让开发人员可以很快的得知要使用的 XPath 语法,以利开发人员利用它来解析 HTML 的位置资讯。

    不 过笔者认为这套工具太过於阳春(也许 Simon Mourier 对 Windows Forms 或 WPF 不熟),因此笔者建议配合像 FireFox 或是 IE8 所提供的开发者工具(Developer Tools)来自行建构 XPath 会比较适合,而且它们也都提供可以圈选网页的某一个部份并标示其 HTML 位置的能力,这样要建构 XPath 也会比较快。

    摘自:http://msdn.microsoft.com/zh-tw/ee787055.aspx

  • 相关阅读:
    Java中static、final、static final的区别(转)
    常见 重要知识精简总结
    面向对象编程三大特性------封装、继承、多态
    解决点击输入框调起键盘时,输入框被键盘遮挡的问题
    实用连接
    媒体查询兼容IE浏览器
    拖动到回收站删除
    vue2.0--组件通信
    图片上传
    上传图片预览
  • 原文地址:https://www.cnblogs.com/honeymoon/p/2682471.html
Copyright © 2020-2023  润新知