C# HtmlAgilityPack和AngleSharp 解析HTML
by:wgscd
date:2018-1-17
HtmlAgilityPack 有点是只有一个单独DLL。AngleSharp 缺点是包含另外的一些DLL,如 Threading。
现在我们可以用一个.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)
{
}
}
----------------------test sample-----------------------------------------------------
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument ();
------------------------------------------------------------------------------------------
AngleSharp是个开源项目, 主页地址。
AngleSharp 缺点是包含另外的一些DLL,如 Threading
----------------------------------------------sample--------------------------------------
var parser = new HtmlParser();
//为以下源代码生成HTML DOM
var document = parser.Parse("<ul><li>First element<li>Second element<li>third<li class=bla>Last");
//获取所有li元素并将test属性设置为值测试
var elements = document.QuerySelectorAll("li").Attr("test", "test");
//元素仍然包含所有li元素
ViewData["html"] = document.DocumentElement.OuterHtml;
C# HtmlAgilityPack和AngleSharp 解析HTML的更多相关文章
- 用DOM实现文章采集-HtmlAgilityPack实现html解析
Html Agility Pack 是CodePlex 上的一个开源项目.它提供了标准的DOM API 和XPath 支持! 下载地址:http://htmlagilitypack.codeplex. ...
- 我最优惠网系列(1)——HTML 解析类库HtmlAgilityPack
0. 序言 在开发我最优惠网的过程中,遇到一些问题和技术点,写出来和大家分享,也是我自己对近期工作的整理和记录,预计会有解析HTML类库.本地缓存.链接跳转和C#中执行js代码技巧等方面. 1. Ht ...
- .NET Core 网络数据采集 -- 使用AngleSharp做html解析
有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: ...
- C#:使用HtmlAgilityPack解析Html
推荐阅读: HtmlAgilityPack 入门教程1 HtmlAgilityPack入门教程2 向HtmlAgilityPack道歉:解析HTML还是你好用 获取html中meta标签中的conte ...
- HTML 解析类库HtmlAgilityPack
1. HtmlAgilityPack简介 网站中首先遇到的问题是爬虫和解析HTML的问题,一般情况在获取页面少量信息的情况下,我们可以使用正则来精确匹配目标.不过本身正则表达式就比较复杂,同时正则表达 ...
- HtmlAgilityPack组件
HtmlAgilityPack组件用于解析Html字符串,一个典型的应用场景是用于网页爬虫. 示例程序 using Common.Tools; using Datebase.Entity; using ...
- HtmlAgilityPack相关网页
//多线程 http://www.cnblogs.com/jiangming/archive/2012/09/11/MultiThreadCallWebbrowser.html //替换Webbrow ...
- C#+HtmlAgilityPack—>糗事百科桌面版V2.0
最近在浏览以前自己上传的源码,发现在糗事百科桌面端源码评论区中,有人说现在程序不能用了.查看了一下源码运行情况,发现是正则表达式解析问题.由于糗百的网页版链接和网页格式稍有变化,导致解释失败.虽然可以 ...
- net core体系-网络数据采集(AngleSharp)-1初探
有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: ...
随机推荐
- Windows7系统如果安装&升级IE11浏览器
作为一个前端工作人员,IE678简直就是噩梦,还好现在大多数网站已经开始放弃了对IE6/7/8的支持了. 由于Win7系统默认是安装的IE8,所以在打开部分网站时会提示:IE浏览器版本过低.解决方法如 ...
- 登录PeopleTools 提示ora-00942表视图不存在 select xxx from sysadm.psoprdefn
起因:本来跟DBA说了把生产的库同步到CFG环境,还跟她说了,dev tst cfg在一台机器上,结果她还是把dev给覆盖了,幸好及时发现,一部分对象被删除了(序列,视图,有可能也有表). 视图和一部 ...
- AppManager
1.统一应用程序中所有的Activity的栈管理 涉及到activity的添加.删除指定.删除当前.删除所有.返回栈大小的方法 public class AppManager { private S ...
- [Ubuntu] 解决 ubuntu 升级时 /boot 空间不足
经常升级Linux内核,导致更新时警告/boot分区空间不足.这是以为多次升级内核后,导致内核版本太多,清理一下没用的内核文件就行了. 原文地址请保留http://www.cnblogs.com/ro ...
- Mongodb集群——master/slave
集群的配置 (本测试放于同一台机器进行配置,所以IP地址一样,如果是在不同的服务器上更换IP便可以) 1.目录结构 拷贝两份mongodb到/home/scotte.ye/mongo1 ...
- EasyUI tree reload时更改参数的问题。
[问题]很多时候,我们需要重新加载tree数据,不仅仅是简单地刷新,更多的是重定向了URL,其中就包括参数的调整. moduleTree = $('#tree').tree({ queryParams ...
- IBM ServerGuide引导盘全系列下载网址
IBM ServerGuide引导盘全系列下载网址 官网链接 https://www.ibm.com/support/home/docdisplay?lndocid=SERV-GUIDE v9.30 ...
- npm安装vue
目录 npm安装vue Vue.js 是什么 直接用script引入 安装vue 对不同构建版本的解释 安装命令行工具 (CLI) 安装cnpm 安装vue-cli 新建vue项目 运行服务 目录结构 ...
- 【python27】猜随机数的小游戏
游戏规则: 猜一个随机数,如果猜对了就给出相应的猜成功提示语(自定义文字),如果猜大或者是猜小了,给出对应的提示,但总的猜次数为三次,每猜错一次重新猜时,给用户提示所剩余的猜次数 实现如下: # -* ...
- ocr jdk
公司有个需求,遍历所有图片,筛选出含有敏感字的图片.这里就需要ocr技术,找了几天,发现了几个不错的ocr jdk. http://cn.ocrsdk.com/ 俄罗斯公司,贵有贵的道理 http:/ ...