2013年9月10日 星期二

[轉貼] HTML Agility Pack (抓取網頁某區域Html原始碼)


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form runat="server">
    <!--顯示第一筆的超連結-->
    <asp:Literal ID="li_showData" runat="server" />
    
    </form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Net;
using System.Text;
using System.IO;

/*要引用此命名空間*/
using HtmlAgilityPack;
 
public partial class _Default : System.Web.UI.Page
{
    //Page_Load事件  
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            WebClient client = new WebClient();
            MemoryStream ms = new MemoryStream(client.DownloadData("http://www.labor.gov.tw/hotnews_certification.asp"));

            HtmlDocument doc = new HtmlDocument();
            //使用UTF8反而會變亂碼,要用Default
            doc.Load(ms, Encoding.Default);
            //doc為全部的Html Code
            /*
            目前 HTML Agility Pack 預設編碼應是法文編碼,所以如果是讀取中文 HTML 內容的話,無法直接使用 HtmlDocument.LoadHtml() 方法,
             * 而要透過 MemoryStream 使用 HtmlDocument.Load() 方法,才可以指定中文的編碼。
             */
            // 裝載第一層查詢結果
            HtmlDocument newsHtml = new HtmlDocument();
            //數字從1算起,要注意抓下來的Html Code,階層不一定跟來源網站完全一樣
            //遇到DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
            //<meta http-equiv="Content-Type" content="text/html; charset=big5"/>這行的,又要重新LoadHtml從html[1]開始算起
            //串到一半覺得階層太過深入的話,可以把原始碼貼到VS設計畫面後再利用熱鍵(Ctrl+K,Ctrl+D)來排版
            //註解應該不用算
            newsHtml.LoadHtml(doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/table[1]/tr[1]/td[1]/table[1]/tr[2]/td[1]/table[1]/tr[1]/td[2]/table[1]/tr[1]/td[1]").InnerHtml);
            //最新消息的Html table
            newsHtml.LoadHtml(newsHtml.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/table[1]/tr[2]/td[1]").InnerHtml);


            /*使用OuterHtml或InnerHtml顯示出來的Html Code都一樣*/
            string showData = newsHtml.DocumentNode.SelectSingleNode(@"/table[1]/tbody[1]/tr[3]/td[2]").InnerHtml + "," +
                newsHtml.DocumentNode.SelectSingleNode(@"/table[1]/tbody[1]/tr[3]/tr[1]/td[2]").InnerHtml + "," +
           newsHtml.DocumentNode.SelectSingleNode(@"/table[1]/tbody[1]/tr[3]/tr[1]/tr[1]/td[2]").InnerHtml + "," +
          newsHtml.DocumentNode.SelectSingleNode(@"/table[1]/tbody[1]/tr[3]/tr[1]/tr[1]/tr[1]/td[2]").InnerHtml + ",";
            /*ChildNodes[0]數字從0算起*/
            Response.Write(showData+"<hr/>");
            /*嘗試抓取第一筆的超連結*/
            li_showData.Text = newsHtml.DocumentNode.SelectSingleNode(@"/table[1]/tbody[1]/tr[3]/td[2]").ChildNodes[0].Attributes["href"].Value;
             
        }
    }
}
執行結果:
image

檢視原始碼:
image

沒有留言:

張貼留言