C#HTML解析利器HtmlAgilityPack

时间:2022-06-13 19:20:23

  HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手。目前最新版本为1.4.6,下载地址如下: 目前稳定的版本是1.4.6,上一次更新还是2012年,所以很稳定,基本功能全面,也没必要更新了。 

  提到HtmlAgilityPack,就必须要介绍一个辅助工具,不知道其他人在使用的时候,是如何分析页面结构的。反正我是使用官方提供的一个叫做HAPExplorer的工具。非常有用。下面我们在使用的时候会介绍如何使用。

还是以辽宁省为例: ,打开页面,右键获取网页源代码后,粘贴到 HAPExplorer 中,也可以直接在HAPExplorer 中打开链接,如下面的动画演示:

C#HTML解析利器HtmlAgilityPack

  我们可以看到,,右侧的XPath地址,div结束后,下面都是dl标签,就是我们要采集的行了。下面我们用代码来获取上述结构。先看看获取页面源代码的代码:

1

2

3

4

5

6

7

8

9

10

 

public static string GetWebClient(string url)

{

    string strHTML = "";

    WebClient myWebClient = new WebClient();            

    Stream myStream = myWebClient.OpenRead(url);

    StreamReader sr = new StreamReader(myStream, Encoding.Default);//注意编码

    strHTML = sr.ReadToEnd();

    myStream.Close();

    return strHTML;

}

 

public static void ParsePageByArea(String cityCode)

{

    //更加链接格式和省份代码构造URL

    String url = String.Format("http://www.tianqihoubao.com/lishi/{0}.htm", cityCode);

    //下载网页源代码 

    var docText = HtmlHelper.GetWebClient(url);

    //加载源代码,获取文档对象

    var doc = new HtmlDocument(); doc.LoadHtml(docText);

    //更加xpath获取总的对象,如果不为空,就继续选择dl标签

    var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[1]/div[6]/div[1]/div[1]/div[3]");

    if (res != null)

    {

        var list = res.SelectNodes(@"dl");//选择标签数组

        if (list.Count < 1) return;

        foreach (var item in list)

        {

            var dd = item.SelectSingleNode(@"dd").SelectNodes("a");

            foreach (var node in dd)

            {

                var text = node.InnerText.Trim();

                //拼音代码要从href属性中进行分割提取

                var herf = node.Attributes["href"].Value.Trim().Split(‘/‘, ‘.‘);

                Console.WriteLine("{0}:{1}", text, herf[herf.Length - 2]);

            }

        }

    }