/// <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; }
}

使用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. linux命令(2):cd命令

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1.  ...

  2. 转载---ViewPager,PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter的分析对比

    转载:http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View.准确说 ...

  3. MY SQL8.0里程碑发布

    MySQL 开发团队于 12 日宣布 MySQL 8.0.0 开发里程碑版本(DMR)发布! 可能有人会惊奇 MySQL 为何从 5.x 一下跳跃到了 8.0.事实上,MySQL 5.x 系列已经延续 ...

  4. 【go语言】RSA加解密

    关于go语言的RSA加解密的介绍,这里有一篇文章,已经介绍的很完整了. 对应的go语言的加解密代码,参考git. 因为原文跨语言是跟php,我这里要跟c语言进行交互,所以,这里贴上c语言的例子. 参考 ...

  5. LTS

    LTS(light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务.有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用. 1. 支持分布式,解决多点 ...

  6. 调整Win7中TCP/IP半开连接数限制

    调整Win7中TCP/IP半开连接数限制      相信大家都有过这样的经历,普通的ADSL宽带下,打开下载工具下载资源时,再想浏览网页就会变得非常困难了,Windows7中也未能幸免.   究其原因 ...

  7. Getting Started With Hazelcast 读书笔记(第八章-第十章)

    第八章到第十章就是一些介绍性的描述,吹的就是Hazelcast能使用在各种地方..   第八章 -从外面看 1.Hazelcast做了一个memcache的java实现,方便py和php使用. 2.可 ...

  8. DBCC SHOWCONTIG、DBCC DBREINDEX。

    use dbname declare @table_id int set @table_id=object_id('tablename') dbcc showcontig(@table_id) 解释如 ...

  9. 关于fast cgi和php-fpm的关系

    相关文档“https://segmentfault.com/q/1010000000256516%20” 一.什么是cgi cgi是一个协议,这个协议规定我们web服务器访问的时候,nginx和php ...

  10. ps 的一些小东西

    1.画圈 画框 新建图层--矩形选框工具(U)--左上角选 '路径'--画圆/画框--编辑(右键)--描边--ok. 2 ctrl+t 大小变换问题