c#蜘蛛程序之HTML解析利器HtmlAgilityPack

在以前的项目中对HTML解析的,是采用正则表达式一步步将无关的HTML注释及JS代码部分删除掉,然后再用正则表达式找出需要提取的部分,可以说使用正则表达式来做是一个比较繁琐的过程,特别是对于正则表达式不是很熟悉或者要处理的HTML很复杂的情况下。

现在我们可以用一个.NET下的HTML解析类库HtmlAgilityPack。HtmlAgilityPack是一个支持用XPath来解析HTML的类库,学习了解HtmlAgilityPack的API和XPath非常必要。

HtmlAgilityPack是一个开源的.NET类库,它的主页是http://htmlagilitypack.codeplex.com/,在这里可以下载到最新版的类库及API手册,此外还可以下载到一个用于调试的辅助工具。
XPath简明介绍
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
下面列出了最有用的路径表达式:
nodename:选取此节点的所有子节点。 
/:从根节点选取。 
//:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
.:选取当前节点。 
..:选取当前节点的父节点。
例如有下面一段XML:
< ?xml version="1.0" encoding="utf-8" ?>
< articles>
<Article>
<Title>牛B的简历是神马,如此神奇。</Title>
<Url>http://chebazi.net/showtopic-401.aspx</Url>
<CreateAt type="en">2011-04-07</CreateAt>
</Article>
<Article>
<Title lang="eng">
【功夫熊猫2】美国2011冒险动作动画大片
</Title>
<Url>http://chebazi.net/showtopic-109.aspx</Url>
<CreateAt type="zh-cn">
2010年11月23日
</CreateAt>
</Article>
<Article>
<Title>
是爷们的必看,女生勿入!!!
</Title>
<Url>http://chebazi.net/showtopic-396.aspx</Url>
<CreateAt type="zh-cn">
2011年06月12日
</CreateAt>
</Article>
<Article>
<Title lang="eng">
暧昧
</Title>
<Url>http://www.iofeng.com/</Url>
<CreateAt type="zh-cn">
2007-09-08
</CreateAt>
</Article>
< /articles>

针对上面的XML文件,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
/Articles/Article[1]:选取属于Articles子元素的第一个Article元素。 
/Articles/Article[last()]:选取属于Articles子元素的最后一个Article元素。 
/Articles/Article[last()-1]:选取属于Articles子元素的倒数第二个Article元素。 
/Articles/Article[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的Article元素。 
//title[@lang]:选取所有拥有名为lang的属性的title元素。 
//CreateAt[@type=‘zh-cn‘]:选取所有CreateAt元素,且这些元素拥有值为zh-cn的type属性。
/Articles/Article[Order>2]:选取Articles元素的所有Article元素,且其中的Order元素的值须大于2。 
/Articles/Article[Order<3]/Title:选取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值须小于3。

HtmlAgilityPack API简明介绍
在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。
得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。
HtmlAgilityPack实战
http://www.hao123.com/game.htm为列获取下面各项的链接和文字。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using HtmlAgilityPack;

public class Category
{
public string Subject { get; set; }
public string IndexUrl { get; set; }
}
public partial class _Default : System.Web.UI.Page
{
private const string CategoryListXPath = "//html[1]/body[1]/div[3]/center[1]/div[1]/table[1]/tr"; //关键点,不同网站分析不同的路径
private const string CategoryNameXPath = "//td/a[1]"; //关键点,不同网站分析不同的路径
private const string ChooseXPath = "//a[1]";
protected void Button1_Click(object sender, EventArgs e)
{
Uri url = new Uri(this.TextBox1.Text.Trim());
Uri uriCategory = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();

Stream stream = response.GetResponseStream();
StreamReader read = new StreamReader(stream,Encoding.GetEncoding("gb2312"));
string str = read.ReadToEnd();

HtmlDocument html = new HtmlDocument();
html.LoadHtml(str);
HtmlNode rootNode = html.DocumentNode; 
HtmlNodeCollection categoryNodeList = rootNode.SelectNodes(CategoryListXPath); 
HtmlNode temp = null;
List<Category> list = new List<Category>(); 
foreach (HtmlNode categoryNode in categoryNodeList)

temp = HtmlNode.CreateNode(categoryNode.OuterHtml); 
HtmlNode singleNode = temp.SelectSingleNode(CategoryNameXPath);
if(singleNode == null)
continue;
HtmlNodeCollection singleList = temp.SelectNodes(CategoryNameXPath);
foreach(HtmlNode node in singleList)
{
HtmlNode createNode = HtmlNode.CreateNode(node.OuterHtml);
HtmlNode reNode = createNode.SelectSingleNode(ChooseXPath);
if (reNode == null)
continue;
Category category = new Category();
category.Subject = reNode.InnerText;
Uri.TryCreate(url, reNode.Attributes["href"].Value, out uriCategory);
category.IndexUrl = uriCategory.ToString();
list.Add(category); 

}

string re =null;
foreach (Category cate in list)

re +=string.Format("<tr><td><a href={0}>{1}</a></td></tr>",cate.IndexUrl,cate.Subject);
}
this.Literal1.Text = string.Format("<table>{0}</table>", re);
}
protected void Page_Load(object sender, EventArgs e)
{

}
}

时间: 2024-08-02 18:39:47

c#蜘蛛程序之HTML解析利器HtmlAgilityPack的相关文章

HTML解析利器HtmlAgilityPack

在以前的项目中周公曾有解析HTML的情况,当时是采用正则表达式一步步将无关的HTML注释及JS代码部分删除掉,然后再用正则表达式找出需要提取的部分,可以说使用正则表达式来做是一个比较繁琐的过程,特别是对于正则表达式不是很熟悉或者要处理的HTML很复杂的情况下.前一阵子周公还是通过这个办法将http://wz.csdn.net/zhoufoxcn上保存的网址导入到http://cang.baidu.com,本来还想将周公博客上的文章好好整理一下,但是考虑到使用正则真的是很繁琐也很麻烦,所以就一直没

C#HTML解析利器HtmlAgilityPack

HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手.目前最新版本为1.4.6,下载地址如下:http://htmlagilitypack.codeplex.com/ 目前稳定的版本是1.4.6,上一次更新还是2012年,所以很稳定,基本功能全面,也没必要更新了. 提到HtmlAgilityPack,就必须要介绍一个辅助工具,不知道其他人在使用的时候,是如

.NET Core HtmlAgilityPack HTML解析利器

最近学习.NET Core ,想把自己之前的一个项目升级到 .NET Core. 发现HtmlAgilityPack 没法进行引用,遂自己做了些修改,可以运行在 .NET Core 中.现在分享出来,也是为  .NET Core 做一些贡献. .NET Core版 HtmlAgilityPack HTML解析利器,目前是 HtmlAgilityPack Core RC2 HtmlAgilityPack 介绍 HtmlAgilityPack是一个基于.Net的.第三方免费开源的微型类库,主要用于在

打磨程序员的专属利器——文本

打磨程序员的专属利器分三个专题展示-- 1. 命令行&文件 2. 快捷键 3. 文本 (本文) 1. 记笔记 好记性不如烂笔头,对于程序员更是如此.学习某种新语言或者某个库,若事先不记点笔记,几年后再拣起来会非常地慢. 之前自己一直用“为知笔记”,但慢慢发现了几个问题. a. 这个软件喜欢升级,而每次升级都将界面改得面目全非(其实现在绝大多数软件都喜欢没事升级).我只是想一个简洁的软件界面,只想专注于笔记,而为知的每一次更新后都得花精力在熟悉界面上. b. 为知的笔记不是文本,这样笔记内容几乎只

HTML解析利器-HtmlAgility学习

原文:HTML解析利器-HtmlAgility学习 HtmlAgility是一个开源的Html解析库,据说是C#版的JQuery,功能非常强大. 该篇学习它的解析功能,还可以模拟用户请求,创建html,设置代理等等,暂先不研究. ---------------------------------------------------------------------------- 1.简单例子 using System; using System.Collections.Generic; usi

如何用C#语言构造蜘蛛程序

"蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载Web页面以便脱机使用,开发者利用蜘蛛程序扫描自己的Web检查无效的链接……对于不同的用户,蜘蛛程序有不同的用途.那么,蜘蛛程序到底是怎样工作的呢? 蜘蛛是一种半自动的程序,就象现实当中的蜘蛛在它的Web(蜘蛛网)上旅行一样,蜘蛛程序也按照类似的方式在Web链接织成的网上旅行.蜘蛛程序之所以是半自动的,是因为它总

打磨程序员的专属利器——快捷键

打磨程序员的专属利器分三个专题展示-- 1. 命令行&文件 2. 快捷键(本文) 3. 文本 ------------------------------------------aj的分隔线------------------------------------------ 前言 本人与快捷键的渊源应该从游戏开始说起.10年前的经典游戏wow,游戏里的技能非常多,所以玩游戏时将所有比较常用的技术都设置成了快捷键.方向控制改成sdf,然后左手的其它字母键都是技能快捷键.甚至是鼠标滚轮的上下滚动都被

c# Ftp下载程序源码解析

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Threading.Tasks; using System.Windows.Forms; n

几篇不错的关于蜘蛛程序的教程

几篇不错的关于蜘蛛程序的教程,转录一下: pyspider 爬虫教程(一):HTML 和 CSS 选择器 pyspider 爬虫教程(二):AJAX 和 HTTP pyspider 爬虫教程(三):使用 PhantomJS 渲染带 JS 的页面 ?