`
yiheng
  • 浏览: 156724 次
社区版块
存档分类

使用HtmlParser解析HTML (C#版)

 
阅读更多

本文介绍了.net 版的一个HTMLParser网页解析开源类库(Winista.HTMLParser)的功能特性、工作原理和使用方法。对于使用.net进行Web信息提取的开发人员进行了一次HTMLParser的初步讲解。应用实例将会在日后的文中介绍,敬请关注。
一、背景知识
HTMLParser原本是一个在sourceforge上的一个Java开源项目,使用这个Java类库可以用来线性地或嵌套地解析HTML文本。他的功能强大和开源等特性吸引了大量Web信息提取的工作者。然而,许多.net开发者朋友一直在寻找一种能在.net中使用的HTMLParser类库,笔者将介绍Winista.HTMLParser类库,对比于其他原本数量就非常少的.net版HTMLParser类库,Winista的版本的类库结构可以说更接近于原始Java版本。
该类库目前分为Utltimate、Pro、Lite和Community四个版本,前三个版本都是收费的。只有Community版本可以免费下载并查看所有的源码。
当前Community最新版本1.8 下载。
该版本的类库文档下载。

二、功能和特性
1.可以在任何.net语言中使用(C#,VB.net,J#等)
2.可以解析几乎所有的Html标签,并且可以通过标签类别、属性或正则表达式来搜索标签。有些甚至在Java版本中无法支持的标签也在这个版本中得到了支持。
3.设置可扩展的过滤器来过滤结果集中不需要的标签。
4.高性能的API接口使得你能处理许多常见的问题,如:哪些是页面中的外部链接?哪些是图片?哪些是不同的表格?页面中有错误的链接吗等等问题。
5.一个基于Http协议引擎的配置文件使得你能通过一个指定的URL地址来获得该页面内容。该爬虫可以遵循robot.txt协议文件来获得组织和允许访问的列表。
6.Http协议引擎能够完整地处理来自任何站点的反馈。

三、词法分析的工作原理
HTMLParser的词法分析器对HTML进行了4级封装,从低级到高级的顺序为:ParserStream、Source、Page、Lexer。ParserStream负责从文件中获取二进制数据,但不做任何处理。Source把二进制文件转换成相应的字符序列,存储一组未加工的字符序列。Page可以看成是一个string数组,按行存储一个Source文本的每一行第一个字符开始的位置索引。Lexer包含了词法分析的代码,从Page里读取字符串,用Cursor记录当前字符所在位置,通过状态机来生成Nodes节点。
Lexer中真正执行词法分析的是NextCode()方法,它每次词都查找返回下一个Node节点,直到Page结束。算法描述如下:
1.读入一个字符,判断是否已是页尾,是则返回null。
2.判断是否是"<",如果是,则可能是标签入口,需读取下一字符确认。
3.如果都不是,ParserString状态机开始解析一个StringNode,如果是"<",继续读取下一字符。
4.判断是否到页尾,是则产生一个StringNode返回。
5.如果读取到"%",则说明是JSP标签,进入JSP状态机去解析。
6.如果读取到"?",则说明是XML标签,进入XML状态机去解析。
7.如果读取到"/"或任何字母,说明是Tag标签,进入Tag标签状态机去解析。
8.如果读取到"!",则说明进入了一个注释标签,需要再读取一个字符,如果到页尾,则产生一个StringNode返回,如果字符为">"则生成一个RemarkNode返回,否则 回退一个字符,再判断字符如果是"-"则回退一个字符,进入Remark状态机去解析,如果不是,则回退一个字符进入Tag状态机去解析。

四、三种使用方法的比较
1.使用Lexer词法分析器直接解析HTML。
这样的方法较为底层,只能返回一个线性的Node节点序列,通过Lexer.NextNode()方法获得下一个Node的信息。虽然不够方便,但有时可完成一些较为灵活的工作。
调用的方法是(传入string类型的html代码):

Lexer lexer = new Lexer(htmlcode);
INode node = lexer.NextNode();
Console.Write(node.ToString());

返回结果是该页面的第一个标签"html"的Node结点信息。

2.使用Filter结点过滤模式。
如果你有一些很明确的结点需要提取,那么就该使用Filter结点过滤模式。系统定义了17种具体的Filter,根据不同的过滤条件来获得需要的结点。包括依据结点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以继承 Filter做自己的Filter来提取节点。

NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
INode[] nodes = nodeList.toNodeArray();

来获取节点数组,也可以直接访问:
INode node = nodeList.elementAt(i);
来获取Node。
另外,在Filter后得到NodeList以后,我们仍然可以使用nodeList.extractAllNodesThatMatch(someFilter)来进一步过滤,同时又可以用nodeList.visitAllNodesWith(someVisitor)来做进一步的访问。

3.使用Visitor结点访问模式
如果你希望HTMLParser遍历所有的结点,并按结点的不同类型(StringNode、RemarkNode、TagNode)和不同的访问过程来进行不同操作的话,可以使用Visitor模式。NodeVisitor是一个抽象类,分别定义了如下方法:
BeginParsing():解析前进行的操作
VitisTag():访问到开始标签时的操作
VisitEndTag():访问到结束标签时的操作
VisitStringNode():访问到文本结点时的操作
VisitRemarkNode():访问注释结点时的操作
自己定义一个类并继承NodeVisitor类,实现以上几个方法,即完成Visitor模式的访问类。系统也提供了7个具体的结点访问类,具体见上文提供的类库文档。不过这7个类并不实用,大多数的功能还需要自己来扩充定义。调用方法:
Parser parser = Parser.CreateParser((htmlcode), "GBK");//传入string类型的html代码
NodeVisitor visitor = new LinkFindingVisitor(linktext); //以链接查找的Visitor举例
parser.VisitAllNodesWith(visirot);

灵活使用以上三种模式的结合,相信就可以提取到任何我们所需要的信息了。


分享到:
评论

相关推荐

    htmlparser(c#,java)

    HTMLParser是一款强大的库,用于解析HTML文档,它提供了C#和Java两种编程语言的实现,使得开发者在处理HTML内容时有了更多的灵活性。本文将深入探讨HTMLParser的核心功能、使用场景、以及如何在C#和Java中集成和使用...

    c#版htmlparser htmlparser.dll htmlparser源代码

    HTMLParser是一款用于解析HTML文档的库,主要针对C#编程语言设计。在.NET环境中,开发者经常需要处理HTML数据,例如从网页抓取信息或者进行网页自动化。HTMLParser库提供了便捷的方式来解析复杂的HTML结构,提取所需...

    C# HtmlParser使用小实例

    C#中的HtmlParser类提供了方法来解析HTML字符串或流,并返回一个HtmlDocument对象,这个对象代表了HTML文档的结构。 **安装与引用** 在使用Winista.HtmlParser之前,你需要先将其添加到你的C#项目中。如果你有`...

    HtmlParser c#源码+demo

    HTMLParser 是一个C#编写的库,用于解析HTML文档,提取和处理其中的数据。这个库可能包含了一系列的方法和类,帮助开发者在C#环境中高效且准确地解析HTML内容,类似于Java中的Jsoup或者Python的BeautifulSoup。源码...

    C# HTMLParser下载.rar

    HTMLParser是C#中一个强大的库,主要用于解析HTML文档,提取所需的数据。这个库对于开发者来说尤其有用,因为它可以简化复杂的网页结构处理,使我们能够更有效地与HTML文档交互。在"C# HTMLParser下载.rar"压缩包中...

    Winista.Htmlparser 源码 C#类库 帮助文档

    首先,Htmlparser的核心功能在于解析HTML字符串或流,并将其转换为易于操作的对象模型。这个对象模型通常被称为DOM(Document Object Model),它是HTML文档的一种抽象表示,允许我们以树形结构访问和修改文档的各个...

    Winista.HtmlParser(含帮助手册)

    Winista.HtmlParser是一款用于解析HTML文档的库,它在.NET框架下运行,为开发者提供了方便的API来处理和解析HTML内容。这个库的核心目标是帮助程序员高效地从HTML页面中提取所需信息,如元素、属性、文本等。下面将...

    c#使用HtmlParser建立文档树 DomTree

    关于`DomTree`这个文件名,这可能是保存了使用HtmlParser解析后的DOM树的文件。在实际开发中,你可能需要将DOM树序列化为XML或JSON以便存储和传输。你可以使用HtmlDocument的`Save`方法将其写入文件: ```csharp ...

    HTMLParser.net源代码HTMLParser.net使用demo

    HTMLParser.net是一个强大的.NET框架库,专为解析HTML文档而设计。这个库使得开发者能够方便地从HTML中提取数据,处理DOM(文档对象模型),以及与网页内容进行交互。本项目名为"HTMLParser.net源代码HTMLParser.net...

    C# HTML解析类库(含Demo,手册)

    HTMLParser库的核心功能是解析HTML文档,将其转化为易于操作的对象模型。它能够解析HTML标记、属性以及嵌套结构,提供了一种结构化的方式来访问和修改网页内容。这对于数据抓取、网页自动化和前端与后端之间的交互...

    C#htmlparser及入门资料

    C# HTMLParser是一个开源库,它允许开发者通过C#语言来解析HTML文档,提取所需信息。这个库特别适合那些需要从网页中提取数据,或者需要构建爬虫的项目。HTMLParser的设计目标是提供一个快速、灵活且健壮的解决方案...

    html.rar_C# HTML解析_c html解析_html C#

    当我们谈论"C# HTML解析"时,我们指的是使用C#来处理和理解HTML文档的程序设计技术。在本案例中,我们将深入探讨如何在Visual Studio 2010环境下利用C#进行HTML解析。 首先,让我们了解一下HTML解析的基本概念。...

    用C#实现HtmlParser的代码

    该篇文章主要介绍了用C#实现HtmlParser的两种方法,分别是使用System.Net.WebClient下载网页并使用正则表达式来分析Html内容,以及使用Winista.Htmlparser.Net解析Html。下面我们将详细介绍这两种方法。 第一种方法...

    Winista.Htmlparser.Net 源码 +Demo

    2. **WebParser**:可能是一个简单的网页抓取器,利用HtmlParser解析网页,提取所需信息,例如新闻标题、链接等。 开发者可以打开`AnalyzeHtml.sln`,编译并运行这两个项目,以了解HtmlParser的具体使用方法和实际...

    C# 抓取百度MP3地址 htmlparser实例

    HTMLParser库是用于解析HTML文档的开源工具,它使得开发者可以方便地从HTML源码中提取所需信息。在C#中,我们可以利用HTMLParser库的API来解析百度MP3页面,找到隐藏在HTML结构中的MP3链接。 1. **网络请求**:首先...

    Winista.HtmlParser.zip

    《Unity与C#结合解析HTML:Winista.HtmlParser深度探讨》 在当今的数字时代,游戏开发中的交互性越来越重要,HTML作为一种通用的标记语言,常用于构建丰富的用户界面。Unity,作为全球领先的3D游戏开发引擎,其强大...

    C#正则+HTMLParser进行网页信息提取的实例。

    HTMLParser则是用于解析HTML文档的工具,帮助我们更好地理解和操作网页结构。在C#中,可能没有直接名为HTMLParser的库,但我们可以使用HtmlAgilityPack或者AngleSharp等第三方库,它们提供了强大的解析和导航HTML...

    C#下解析HTML的两种方法介绍

    在C#中解析HTML是常见的任务,特别是在开发网络爬虫或进行网页数据提取时。本文将详细介绍两种不同的方法,帮助开发者有效地处理HTML内容。 第一种方法是使用`System.Net.WebClient`类配合正则表达式。`WebClient`...

    vc解析html程序

    【VC解析HTML程序】是一种基于Visual C#(VC)开发的工具,用于高效地解析HTML文档,提取其中的标记内容。HTML(HyperText Markup Language)是网页内容的主要表示语言,而解析HTML则涉及到理解其结构和提取所需信息...

Global site tag (gtag.js) - Google Analytics