惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
小众软件
小众软件
F
Fortinet All Blogs
博客园 - 叶小钗
博客园_首页
D
DataBreaches.Net
Apple Machine Learning Research
Apple Machine Learning Research
U
Unit 42
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家
M
MIT News - Artificial intelligence
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog

博客园 - xiaowy

在c#中使用bitblt显示图片 百度指数完美采集器 线程的暂停与继续 webform 中使用ajax 视频监控系统-电子地图编辑器 视频监控,多画面播放窗口,布局设计器 SendMessageTool 自制文档管理工具,支持全文检索,支持导出CHM,个人觉得蛮实用的! Dev TreeList 性能问题 条码生成器 半连接端口扫描 tcpsynscanner AVQ 第一阶段完成 数据采集工具 点击率作弊器(只求实现功能,代码有点乱) 视频监控的趋势 连接池使用技巧(听自WebCast) 截取Web输入框的内容 抛砖:) 突破QQ音乐下载(绿钻会员限制) db4o schema changes - xiaowy
使用HtmlAgilityPack解析Html(非常好用)
xiaowy · 2013-09-10 · via 博客园 - xiaowy
 /// <summary>
    /// 设计成一个exe,解决WebBrowser控件内存泄漏的问题.
    /// </summary>
    public partial class MainForm : Form
    {
        /// <summary>
        /// 是否处理完成
        /// </summary>
        private bool isCompleted; //webBrowser只能运行在UI线程上,所以这里不用信号通知,而用一个变量,不断检查这个变量的状态

        /// <summary>
        /// 处理结果
        /// </summary>
        private List<RowData> executeResult = new List<RowData>();

        private static MainForm instance = new MainForm();
        /// <summary>
        /// 单件实例
        /// </summary>
        public static MainForm Instance { get { return instance; } }

        private MainForm()
        {
            InitializeComponent();
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
        }

        private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (this.webBrowser.ReadyState != WebBrowserReadyState.Complete)
                return;

            var txt = webBrowser.Document.Body.InnerText;
            var html = webBrowser.Document.Body.InnerHtml;
            if (webBrowser.Document.Title == "选择")
            {
                var items = ExtractData(html);
                executeResult.AddRange(items);
                isCompleted = true;
            }
        }

        private List<RowData> ExtractData(string html)
        {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);

            HtmlAgilityPack.HtmlNode node = doc.GetElementbyId("div");
            var trNodes = node.SelectNodes("tbody/tr");

            List<RowData> rows = new List<RowData>();
            foreach (var trNode in trNodes)
            {
                var tdNode = trNode.SelectNodes("td/div");
                RowData row = new RowData();
                rows.Add(row);

                row.航班 = tdNode[0].InnerText;
                row.出发时间 = tdNode[1].InnerText;
                row.到达时间 = tdNode[2].InnerText;
                row.机场 = tdNode[3].InnerText;
                row.机型 = tdNode[4].InnerText;
                row.头等 = tdNode[5].InnerText;
                row.公务 = tdNode[6].InnerText;
                row.全价 = tdNode[7].InnerText;
                row.折扣 = tdNode[8].InnerText;
                row.特价 = tdNode[9].InnerText;
            }

            return rows;
        }

        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="fromCity">出发城市代码</param>
        /// <param name="toCity">到达城市代码</param>
        /// <param name="date">出发日期</param>
        /// <param name="timeout">超时时间</param>
        /// <returns>机票信息</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public List<RowData> Query(string fromCity, string toCity, DateTime date, TimeSpan timeout)
        {
            isCompleted = false;
            executeResult.Clear();

            string urlTemplate = "http://www.xxx.com";
            string url = string.Format(urlTemplate, fromCity, date.Month, date.Day, date.Year, toCity);
            Navigate(url);

            DateTime startTime = DateTime.Now;
            //未处理完,且没有超时,则等待
            while (!isCompleted && startTime.Add(timeout) > DateTime.Now)
            {
                Thread.Sleep(100);
                Application.DoEvents();
            }

            return executeResult;
        }

        private void Navigate(string url)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new Action<string>(Navigate), url);
                return;
            }

            webBrowser.Navigate(url);
        }
    }

    /// <summary>
    /// 对应到页面上的每一行数据
    /// 不喜欢中文请自行修改
    /// </summary>
    public class RowData
    {
        public string 航班 { get; set; }
        public string 出发时间 { get; set; }
        public string 到达时间 { get; set; }
        public string 机场 { get; set; }
        public string 机型 { get; set; }
        public string 头等 { get; set; }
        public string 公务 { get; set; }
        public string 全价 { get; set; }
        public string 折扣 { get; set; }
        public string 特价 { get; set; }
    }