使用HtmlAgilityPack解析Html(非常好用)
/// <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(非常好用)的更多相关文章
- HtmlAgilityPack解析全国区号页面到XML
需求:完成一个城市和区号的xml配置文件 处理思路:通过HtmlAgilityPack解析一个区号页面,生产xml文件 页面:http://www.hljboli.gov.cn/html/code.h ...
- HtmlAgilityPack解析器在WP8.1下报错,不仅如此,社交化分享也报错。
以前WP7下是用的HtmlAgilityPack和 XPath来解析网页,很好用. 但是在Wp8.1下,这个里面却缺少了一个很重要的方法. HtmlDocument doc = new HtmlDoc ...
- HtmlAgilityPack --解析Html源码
最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下 ...
- C#:使用HtmlAgilityPack解析Html
推荐阅读: HtmlAgilityPack 入门教程1 HtmlAgilityPack入门教程2 向HtmlAgilityPack道歉:解析HTML还是你好用 获取html中meta标签中的conte ...
- 使用HtmlAgilityPack解析html
HtmlAgilityPack是.net下使用xPath来解析html的类库,可以方便的做html的页面分析处理 项目地址: http://htmlagilitypack.codeplex.com/ ...
- 使用C#和HtmlAgilityPack解析HTML
近期,有一个需求,需要解析HTML页面,读取一些需要的数据后,插入本地数据库.我知道可以通过正则表达式实现,然而正则表达式之于我,就像汇编语言之于我,一样.我知道它是干什么的,我也知道它能干什么,但是 ...
- .Net Core下使用HtmlAgilityPack解析采集互联网数据
HtmlAgilityPack应该算是.Net下最好用的html解析库了. 因为最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack.并简单的记录下使用的 ...
- HtmlAgilityPack解析html文档
一.概述 HtmlAgilityPack(以下简称HAP)是一个基于.Net的.第三方免费开源的微型类库,主要用于在服务器端解析html文档. HtmlAgilityPack为网页提供了标准的DOM ...
- c#HtmlAgilityPack解析html
通过HtmlAgilityPack实现对html页面解析HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var itemLis ...
- C#爬虫(04):HtmlAgilityPack解析html文档
原文链接 https://www.cnblogs.com/springsnow/p/13278283.html 目录 一.爬虫概述 1.使用浏览器获取页面源码 2.HTML解析组件 二.HtmlAgi ...
随机推荐
- QT征程之初识qt
下载 https://www.qt.io/cn/download-open-source/ 下载QT离线安装包 Qt 5.5.1 for Linux 32-bit (546 MB) (info ...
- 基于sentinel 的redis集群环境搭建
环境信息,三台机器,一台master,两台slave,每台机器上启动一个sentinel master 192.168.1.106 slave1 192.168.1.102 slave2 192.16 ...
- Git相关知识
一些有用的链接: https://www.git-scm.com/ http://nvie.com/posts/a-successful-git-branching-model/ Git开发模式: 建 ...
- 用css伪类制作三角形的三种方法
在手机上写三角形的时候,我一般都用伪类,刚开始的时候用的图片,但是在现在的手机高清屏幕上,图片容易失真,还是用伪类吧! 第一种:一个90度的“ > ”, 只有线条.(可以做下拉框的箭头之类的) ...
- ギリギリ eye (优先队列)
1.题目: [题目描述] A.D.1999,由坠落地球的"谜之战舰"带来的 Over Technology,揭示了人类历史和远 古文明之间的丝丝联系,促使人类终止彼此间的战争,一方 ...
- (转)C#中键值对类型Hashtable与Dictionary比较和相关用法
最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结. Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是 ...
- HYSBZ 4551 (树状数组) 采花
题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...
- apache 指定的网络名不再可用 原因及解决方法
1.出现问题状况: 出现问题网站:http://www.ayyzz.cn/ 前段时间作文大全网出现有时候比较慢,有时候“找不到网页”404错误:另外在error.log里也报错: [Mon May 0 ...
- NC JDK报tools.jar错误(61版本)
添加jdk/lib目录下的tools.jar 然后设置环境变量
- MySQL数据库设置远程访问权限方法总结
1,设置访问单个数据库权限 mysql>grant all privileges on test.* to 'root'@'%'; 说明:设置用户名为root,密码为空,可访问数据库test 2 ...