HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦(转)

自从 Web 应用程序自 1993 年 W3C 设立以来就开始发展,而且 HTML 也历经了数个版本的演化(1.0 – 2.0 – 3.0 – 3.2 –
4.0 – 4.01),现在也已经成为Web网页或应用程序的最基础,想要学习如何设计 Web 网页或开发 Web
应用程序,这已经是绝对必须要学的东西了,就算是方便的控件(例如 ASP.NET),但 HTML 仍然有学习它的必要性,因此如果不会 HTML,就等于没学过
Web 网页一般。

拜 HTML 与 Web
浏览器蓬勃发展之赐,各式各样的应用都在网络上迅速发展,举凡电子商务、企业门户、在线下单、企业间协同应用等,乃至于社交、个性化、Web 2.0
等商务与组织运用等能力,而在信息爆炸的时代,很多信息整合的应用也随之出炉,而这些信息整合的应用程序都会连接到不同的网站下载其信息,并且在重重的 HTML
中剖析出想要的数据(例如每股价格、涨跌幅、成交量等)。

但是 HTML 本身并不是一个结构严谨的语言,它允许卷标(tag)可以在不 close 的情况下继续使用。这也是因为浏览器设计的高容错性(Fault
Tolerance)所致,如此一来,想要依照规则来剖析 HTML 文件几乎变得不可能,而且对方的网站的 HTML 结构也可能会随时变化,在这种情况下,剖析
HTML 变得非常辛苦,虽然 W3C 有另外推展 XHTML(遵守 XML 严谨格式的 HTML),但使用它来设计网页的案例仍为少数,大多数的网站仍然是使用
HTML。因此我们会需要一个工具,能够有方法快速的解析 HTML 以取出我们需要的数据。

大家都知道,HTML 本身其实只是一个 HTML 标记的字符串而已,因此一般说到要解析 HTML,第一个会想到的大概就是字符串比对(string
comparison),自己针对 HTML 的结构写一个 pattern,然后由函式去做逐一的比对,例如:

[C#]

1. string pattern = "";

2. html.IndexOf(pattern);

不过传统的字符串比对效能太差,也没有一个规则性,因而才发展出正则表达式(Regular Expression)技术,例如下列这样的语法:

[Regular Expression]

1. \s]+))?)+\s*|\s*)/?<

但 Regular Expression 的学习曲线很高,若要使用它来解析
HTML,并且再加以定制化(Customization)的话,对于一般开发人员来说,实在没有什么亲和力。

HTML 还有一个特色,就是它是具层性(Hierarchy)的,因此浏览器在解译它的时候都会以文件树(document
tree)的方式,再用递归(recursive)的方法来处理它,但 Regular Expression
没有支持层级性的剖析,而最接近阶层剖析又好用的工具,莫过于 XML Parser 了,它的 DOM 以及 XPath 的特性,都可以让解析 XML
的工作变得轻松,然而 XML Parser 无法读取一般的 HTML(XHTML 可以),因为一般的 HTML 是结构松散的类型,XML Parser
会在读入时检查语法结构是否完整(也就是 Well-known 的结构),若读入的是结构松散的内容的话会掷出例外讯息,因此无法直接使用 XML Parser
来辅助。

HTML
Agility Pack
 是由法国的一位软件架构师 Simon Mourier 所开发,并且由 DarthObiwan 以及 Jessynoo
辅助开发出来的一个软件工具,它可以让剖析松散格式 HTML 的工作就像剖析 XML 一样简单,它也有类似于 System.Xml 命名空间中的 XML DOM
的许多类别,除了可以使用阶层的方式存取 HTML 以外,它也支持使用 XPath 的方式来搜寻 HTML,这会较以往使用文字比对或是 Regular
Expression 的比对方式来得更明确。

若要使用 HTML Agility Pack 组件,可先上 Codeplex 的 HTML
Agility Pack 网站下载二进制文件(同时也提供源代码、说明文件以及 HAP Explorer 工具程序可下载),并解压缩后,在项目加入对
HtmlAgilityPack.dll 的引用。

Html Agility Pack
源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)Html
Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个
HtmlNodeCollection集合类。

HTML Agility Pack的操作起来还是很麻烦,下面我们要介绍的这个组件是ScrapySharp,他在2个方面针对Html Agility
Pack进行了包装,使得解析Html页面不再痛苦,幸福指数直线上升到90分哈。

ScapySharp有了一个真实的浏览器包装类(处理Reference,Cookie等),另外一个就是使用类似于jQuery一样的Css选择器和Linq语法。让我们使用起来非常的爽。它的代码放在 https://bitbucket.org/rflechner/scrapysharp。也可以通过Nuget添加

下面我们来看一段解析博客园的博客文章的代码:

using System; 
using System.Collections.Generic; 
using
System.Linq; 
using System.Text; 
using
HtmlAgilityPack; 
using ScrapySharp.Extensions; 
using
ScrapySharp.Network;

namespace HTMLAgilityDemo 

class
Program 

static void Main(string[]
args) 

var uri = new Uri("http://www.cnblogs.com/shanyou/archive/2012/05/20/2509435.html");
var
browser1 = new ScrapingBrowser(); 
var html1 =
browser1.DownloadString(uri); 
var htmlDocument = new
HtmlDocument(); 
htmlDocument.LoadHtml(html1); 
var html =
htmlDocument.DocumentNode;

var title = html.CssSelect("title"); 
foreach (var htmlNode in
title) 

Console.WriteLine(htmlNode.InnerHtml); 

var
divs = html.CssSelect("div.postBody");

foreach (var htmlNode in
divs) 

Console.WriteLine(htmlNode.InnerHtml); 
}

divs = html.CssSelect("#cnblogs_post_body"); 
foreach (var htmlNode
in
divs) 

Console.WriteLine(htmlNode.InnerHtml); 



}

Basic examples of CssSelect usages:

var divs = html.CssSelect("div");  //all div elements

var nodes = html.CssSelect("div.content"); //all div elements
with css class ‘content’

var nodes = html.CssSelect("div.widget.monthlist"); //all div
elements with the both css class

var nodes = html.CssSelect("#postPaging"); //all HTML elements
with the id postPaging

var nodes = html.CssSelect("div#postPaging.testClass"); // all
HTML elements with the id postPaging and css class testClass

var nodes = html.CssSelect("div.content < p.para"); //p
elements who are direct children of div elements with css class ‘content’

var nodes = html.CssSelect("input[type=text].login"); // textbox
with css class login

We can also select ancestors of elements:

var nodes =
html.CssSelect("p.para").CssSelectAncestors("div.content <
div.widget");

参考文章:

HTML
Agility Pack:簡單好用的快速 HTML Parser

开源项目Html
Agility Pack实现快速解析Html

c#中的jQuery——HtmlAgilityPack

Html
Agility Pack基础类介绍及运用

.Net解析html文档类库HtmlAgilityPack完整使用说明--采集软件开发尤其好用

Crawler-Lib
Crawler Engine

挖掘百度关键词示例:BaiduTools.zip

原文地址:http://www.cnblogs.com/shanyou/archive/2012/05/27/2520603.html

HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦(转),布布扣,bubuko.com

时间: 2024-10-25 13:24:45

HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦(转)的相关文章

HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦

var divs = html.CssSelect("div");  //all div elementsvar nodes = html.CssSelect("div.content"); //all div elements with css class 'content'var nodes = html.CssSelect("div.widget.monthlist"); //all div elements with the both c

HtmlAgilityPack搭配 ScrapySharp或HtmlAgilityPack.CssSelectors

Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲 美:)Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类. 一.ScapySharp HTML Agility Pack的操作起来还是很麻烦,下面我们要介绍的这个组件是Scra

Html Agility Pack 解析Html

Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Firebug 找到文章列表的内容区域 如上面图片 我们已经找到了想要的内容 在Html 中的位置 那么接下来 第一步就是获取Html  然后 用Html Agility Pack 找出我们想要的东西 1. 获网页的Html 1 #region 获取文章列表 +GetHtml(string url) 2

网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp

最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/ScrapySharp去看看, 看到这句下载提示:To install ScrapySharp, run the following command in the Package Manager Console PM> Install-Package ScrapySharp 接下去我就去找package man

WP8 中使用HTML Agility Pack与友盟分享SDK遇到的 System.Xml.XPath加载问题

今晚在尝试使用友盟最新的社交分享SDK时,按照官方Demo,并未做多少多少改动,就是去除了对微信.脸书和推特的分享.然后运行之后就一直报错 : {System.IO.FileLoadException: Could not load file or assembly 'System.Xml.XPath, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Th

[c#] Html Agility Pack 解析HTML

摘要 在开发过程中,很有可能会遇到这样的情况,服务端返回的是html的内容,但需要在客户端显示纯文本内容,这时候就需要解析这些html,拿到里面的纯文本.达到这样的目的可以有很多途径,比如自己写正则表达式,但对于没有什么规则的内容,就有点力不从心了.Html Agility Pack开源组件,可以通过xPath的方式快速的解析html内容. 一个例子 组件网址:http://htmlagilitypack.codeplex.com/ ,你可以通过Nuget进行安装. 比如我们这里解析博客园首页文

开源项目Html Agility Pack实现快速解析Html

[转]开源项目Html Agility Pack实现快速解析Html 这是个很好的的东西,以前做Html解析都是在用htmlparser,用的虽然顺手,但解析速度较慢,碰巧今天找到了这个,就拿过来试,一切出乎意料,非常爽,推荐给各位使用. 下面是一些简单的使用技巧,希望对大家有用,我个人也是个学习过程. Why Html Agility Pack? (以下简称HAP) .Net下解析HTML文件有很多种选择,包括微软自己也提供MSHTML用于manipulate HTML文件.但是,经过我一段时

一款很不错的html转xml工具-Html Agility Pack 实现html转Xml

[转]一款很不错的html转xml工具-Html Agility Pack 之前发个一篇关于实现html转成xml的劣作<实现html转Xml>,受到不少网友的关心.该实现方法是借助htmlparser去分解html内容,然后按照dom的结构逐个生成xml字符串.在没有充分实践后,还以为该方案能解决问题.然而经过实际使用,效率确实很低,而且对一些特殊html属性的转换也不支持,得到的结果差强人意. 偶然一次机会在浏览codeplex网站时,发现一款很不错的html解析以及转换工具,就是本篇标题

C#解析HTML神器 Html Agility Pack

曾经,我傻乎乎的用正则表达式成功的解析了学校的新闻网.教务管理系统.图书馆管理系统中我想要的所有的内容.那时候废了好大的劲写那正则啊,而且最后还是各种不给力,经常会有意想不到的bug出现,最后经过无数次修复才基本可以正常使用.但是还是很不爽的.后来看见别人用这个东西解析HTML,就感觉很强大,今天自己动手尝试了一下,当时几天的代码,用这个类库几分钟就搞定了.废话不多说,进入主题. Html Agility Pack主页:http://htmlagilitypack.codeplex.com/ 作