1. 程式人生 > >C#對HTML文件的解析

C#對HTML文件的解析

相信很多人都有過HTML文件解析的需求。比如我們抓取了某1個網站的頁面資料,格式就是HTML的格式。以前我們都是通過正則表示式來進行解析,但是發現有一些問題。解析HTML文件時並不容易,如果文件的格式稍有變化很可能就不能正確的匹配。因此我們需要專門的工具來幫助我們輕鬆的解析HTML文件。

其實已經有一個非常不錯的工具提供了。比如HtmlAgilityPack。它可以幫助我們解析HTML文件就像用XmlDocument類來解析XML一樣輕鬆、方便。

好了,下面提供一個足夠Simple的例子給大家。大家可以在此基礎之上,舉一反三。

比如要解析下面的HTML。

<table>
	<thead>
		<tr>
			<th>時間</th>
			<th>型別</th>
			<th>名稱</th>
			<th>單位</th>
			<th>金額</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>2013-12-29</td>
			<td>發票1</td>
			<td>採購物資發票1</td>
			<td>某某公司1</td>
			<td>123元</td>
		</tr>
		<tr>
			<td>2013-12-29</td>
			<td>發票2</td>
			<td>採購物資發票2</td>
			<td>某某公司2</td>
			<td>321元</td>
		</tr>
	<tbody>
</table>

以控制檯專案為例,首先要引用HtmlAgilityPack.dll檔案,這樣才能使用dll裡面的類和方法。

        static void Main(string[] args)
        {
            string strWebContent = @"<table><thead>
            <tr>
              <th>時間</th>
              <th>型別</th>
              <th>名稱</th>
              <th>單位</th>
              <th>金額</th>
            </tr>
            </thead>
            <tbody>" +
            @"<tr>
              <td>2013-12-29</td>
              <td>發票1</td>
              <td>採購物資發票1</td>
              <td>某某公司1</td>
              <td>123元</td>
            </tr>" +
            @"<tr>
              <td>2013-12-29</td>
              <td>發票2</td>
              <td>採購物資發票2</td>
              <td>某某公司2</td>
              <td>321元</td>
            </tr>
            </tbody>
          </table>
        ";

            List<Data> datas = new List<Data>();//定義1個列表用於儲存結果

            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(strWebContent);//載入HTML字串,如果是檔案可以用htmlDocument.Load方法載入

            HtmlNodeCollection collection = htmlDocument.DocumentNode.SelectSingleNode("table/tbody").ChildNodes;//跟Xpath一樣,輕鬆的定位到相應節點下
            foreach (HtmlNode node in collection)
            {
                //去除\r\n以及空格,獲取到相應td裡面的資料
                string[] line = node.InnerText.Split(new char[] { '\r', '\n', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                //如果符合條件,就載入到物件列表裡面
                if (line.Length == 5)
                    datas.Add(new Data() { 時間 = line[0], 型別 = line[1], 名稱 = line[2], 單位 = line[3], 金額 = line[4] });
            }

            //迴圈輸出檢視結果是否正確
            foreach (var v in datas)
            {
                Console.WriteLine(string.Join(",", v.時間, v.型別, v.名稱, v.單位, v.金額));
            }
        }
    /// <summary>
    /// 定義的實體類用於接收資料
    /// </summary>
    public class Data
    {
        public string 時間 { get; set; }
        public string 型別 { get; set; }
        public string 名稱 { get; set; }
        public string 單位 { get; set; }
        public string 金額 { get; set; }
    }

上面就是完整的程式碼,註釋也很清楚。

最後看一下解析的結果: