1. /// <summary>
  2. /// 设计成一个exe,解决WebBrowser控件内存泄漏的问题.
  3. /// </summary>
  4. public partial class MainForm : Form
  5. {
  6. /// <summary>
  7. /// 是否处理完成
  8. /// </summary>
  9. private bool isCompleted; //webBrowser只能运行在UI线程上,所以这里不用信号通知,而用一个变量,不断检查这个变量的状态
  10.  
  11. /// <summary>
  12. /// 处理结果
  13. /// </summary>
  14. private List<RowData> executeResult = new List<RowData>();
  15.  
  16. private static MainForm instance = new MainForm();
  17. /// <summary>
  18. /// 单件实例
  19. /// </summary>
  20. public static MainForm Instance { get { return instance; } }
  21.  
  22. private MainForm()
  23. {
  24. InitializeComponent();
  25. webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
  26. }
  27.  
  28. private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  29. {
  30. if (this.webBrowser.ReadyState != WebBrowserReadyState.Complete)
  31. return;
  32.  
  33. var txt = webBrowser.Document.Body.InnerText;
  34. var html = webBrowser.Document.Body.InnerHtml;
  35. if (webBrowser.Document.Title == "选择")
  36. {
  37. var items = ExtractData(html);
  38. executeResult.AddRange(items);
  39. isCompleted = true;
  40. }
  41. }
  42.  
  43. private List<RowData> ExtractData(string html)
  44. {
  45. HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
  46. doc.LoadHtml(html);
  47.  
  48. HtmlAgilityPack.HtmlNode node = doc.GetElementbyId("div");
  49. var trNodes = node.SelectNodes("tbody/tr");
  50.  
  51. List<RowData> rows = new List<RowData>();
  52. foreach (var trNode in trNodes)
  53. {
  54. var tdNode = trNode.SelectNodes("td/div");
  55. RowData row = new RowData();
  56. rows.Add(row);
  57.  
  58. row.航班 = tdNode[0].InnerText;
  59. row.出发时间 = tdNode[1].InnerText;
  60. row.到达时间 = tdNode[2].InnerText;
  61. row.机场 = tdNode[3].InnerText;
  62. row.机型 = tdNode[4].InnerText;
  63. row.头等 = tdNode[5].InnerText;
  64. row.公务 = tdNode[6].InnerText;
  65. row.全价 = tdNode[7].InnerText;
  66. row.折扣 = tdNode[8].InnerText;
  67. row.特价 = tdNode[9].InnerText;
  68. }
  69.  
  70. return rows;
  71. }
  72.  
  73. /// <summary>
  74. /// 查询数据
  75. /// </summary>
  76. /// <param name="fromCity">出发城市代码</param>
  77. /// <param name="toCity">到达城市代码</param>
  78. /// <param name="date">出发日期</param>
  79. /// <param name="timeout">超时时间</param>
  80. /// <returns>机票信息</returns>
  81. [MethodImpl(MethodImplOptions.Synchronized)]
  82. public List<RowData> Query(string fromCity, string toCity, DateTime date, TimeSpan timeout)
  83. {
  84. isCompleted = false;
  85. executeResult.Clear();
  86.  
  87. string urlTemplate = "http://www.xxx.com";
  88. string url = string.Format(urlTemplate, fromCity, date.Month, date.Day, date.Year, toCity);
  89. Navigate(url);
  90.  
  91. DateTime startTime = DateTime.Now;
  92. //未处理完,且没有超时,则等待
  93. while (!isCompleted && startTime.Add(timeout) > DateTime.Now)
  94. {
  95. Thread.Sleep(100);
  96. Application.DoEvents();
  97. }
  98.  
  99. return executeResult;
  100. }
  101.  
  102. private void Navigate(string url)
  103. {
  104. if (InvokeRequired)
  105. {
  106. BeginInvoke(new Action<string>(Navigate), url);
  107. return;
  108. }
  109.  
  110. webBrowser.Navigate(url);
  111. }
  112. }
  113.  
  114. /// <summary>
  115. /// 对应到页面上的每一行数据
  116. /// 不喜欢中文请自行修改
  117. /// </summary>
  118. public class RowData
  119. {
  120. public string 航班 { get; set; }
  121. public string 出发时间 { get; set; }
  122. public string 到达时间 { get; set; }
  123. public string 机场 { get; set; }
  124. public string 机型 { get; set; }
  125. public string 头等 { get; set; }
  126. public string 公务 { get; set; }
  127. public string 全价 { get; set; }
  128. public string 折扣 { get; set; }
  129. public string 特价 { get; set; }
  130. }

使用HtmlAgilityPack解析Html(非常好用)的更多相关文章

  1. HtmlAgilityPack解析全国区号页面到XML

    需求:完成一个城市和区号的xml配置文件 处理思路:通过HtmlAgilityPack解析一个区号页面,生产xml文件 页面:http://www.hljboli.gov.cn/html/code.h ...

  2. HtmlAgilityPack解析器在WP8.1下报错,不仅如此,社交化分享也报错。

    以前WP7下是用的HtmlAgilityPack和 XPath来解析网页,很好用. 但是在Wp8.1下,这个里面却缺少了一个很重要的方法. HtmlDocument doc = new HtmlDoc ...

  3. HtmlAgilityPack --解析Html源码

    最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下 ...

  4. C#:使用HtmlAgilityPack解析Html

    推荐阅读: HtmlAgilityPack 入门教程1 HtmlAgilityPack入门教程2 向HtmlAgilityPack道歉:解析HTML还是你好用 获取html中meta标签中的conte ...

  5. 使用HtmlAgilityPack解析html

    HtmlAgilityPack是.net下使用xPath来解析html的类库,可以方便的做html的页面分析处理 项目地址: http://htmlagilitypack.codeplex.com/ ...

  6. 使用C#和HtmlAgilityPack解析HTML

    近期,有一个需求,需要解析HTML页面,读取一些需要的数据后,插入本地数据库.我知道可以通过正则表达式实现,然而正则表达式之于我,就像汇编语言之于我,一样.我知道它是干什么的,我也知道它能干什么,但是 ...

  7. .Net Core下使用HtmlAgilityPack解析采集互联网数据

    HtmlAgilityPack应该算是.Net下最好用的html解析库了. 因为最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack.并简单的记录下使用的 ...

  8. HtmlAgilityPack解析html文档

    一.概述 HtmlAgilityPack(以下简称HAP)是一个基于.Net的.第三方免费开源的微型类库,主要用于在服务器端解析html文档. HtmlAgilityPack为网页提供了标准的DOM ...

  9. c#HtmlAgilityPack解析html

    通过HtmlAgilityPack实现对html页面解析HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var itemLis ...

  10. C#爬虫(04):HtmlAgilityPack解析html文档

    原文链接 https://www.cnblogs.com/springsnow/p/13278283.html 目录 一.爬虫概述 1.使用浏览器获取页面源码 2.HTML解析组件 二.HtmlAgi ...

随机推荐

  1. centos6.4安装Apache+MySQL+PHP

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  2. spring整合struts2

    1. Spring 如何在 WEB 应用中使用 ? 1). 需要额外加入的 jar 包: spring-web-4.0.0.RELEASE.jarspring-webmvc-4.0.0.RELEASE ...

  3. 基于jquery封装的颜色下拉选择框

    应同事要求,花了半个小时,写了一个简单的选择颜色的下拉框控件,可以控制输入框指示结果颜色 也贴出来,说不定哪天有用 if (typeof jQuery === 'undefined') { throw ...

  4. 解决 VMWARE MAC 10.12无法全屏的问题

    昨天我在VMware上装了10.10,然后通过APP store 升级了系统到 10.12,升级前安装VMware tools 能自动全屏,可是升级后不行. 然后在网上查了很多资料,发现并没有这方面的 ...

  5. Synchronized和Static Synchronized区别

    通过分析这两个用法的分析,我们可以理解Java中锁的概念. 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念), 一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线 ...

  6. Js制作的文字游戏

    自己制作的文字游戏.(: <!DOCTYPE html><html lang="en"><head>    <meta charset=& ...

  7. vs命令行采集性能数据

    VSPerfASPNETCmd /output:d://PerformanceReport.vsp http://localhost/store/cart.aspx

  8. Android开发工具全面转向Android Studio(1)——准备开发环境

    工欲善其事必先利其器,本文适合Android新手以及用过Eclipse而没用过Android Studio开发Android的老手,众所周知,谷歌是不会再维护和开发ADT了,旧的ADT已经是完全不能渲 ...

  9. Ubuntu 远程登录服务器--ssh的安装和配置

    Ubuntu的安装包居然不自带openssh服务器,所以若要使用ssh远程登录Ubuntu主机,需要首先安装ssh服务器: sudo apt-get install openssh-server 安装 ...

  10. WNDR3700V4 安装SVN Server

    下文所用路由器型号为:WNDR3700V4 参考链接:http://dd-wrt.ca/phpBB2/viewtopic.php?t=86912&highlight=optware http: ...