本文介绍了.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);

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

在.net中运用HTMLParser解析网页的原理和方法相关推荐

  1. 在HTML中使用CSS美化网页的三种方法

    在HTML中使用CSS美化网页的三种方法 CSS是Cascading Style Sheets(级联样式表)的缩写,CSS是一种样式表语言,用于为HTML文档定义布局.例如,CSS涉及字体.颜色.边距 ...

  2. AUTOSAR从入门到精通100讲(十五)-AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解

    一 TC3xx系列MCAL中TASKING Link文件解析以及代码变量定位方法 1 TASKING Link文件解析 1.1 DSRAM中的数据存放: 在AURIX™ 2G中(以TC387为例),每 ...

  3. python中html.parser_在Python中使用HTMLParser解析HTML的教程

    如果我们要编写一个搜索引擎,第一步是用爬虫把目标网站的页面抓下来,第二步就是解析该HTML页面,看看里面的内容到底是新闻.图片还是视频. 假设第一步已经完成了,第二步应该如何解析HTML呢? HTML ...

  4. 网页爬虫 python-Python爬虫解析网页的4种方式

    文章目录 爬虫的价值 正则表达式 requests-html BeautifulSoup lxml的XPath 爬虫的价值 常见的数据获取方式就三种:自有数据.购买数据.爬取数据.用Python写爬虫 ...

  5. python爬虫分析_Python爬虫解析网页的4种方式

    文章目录 爬虫的价值 正则表达式 requests-html BeautifulSoup lxml的XPath 爬虫的价值 常见的数据获取方式就三种:自有数据.购买数据.爬取数据.用Python写爬虫 ...

  6. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  7. python网页结构分析图_Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  8. 爬虫学习----解析网页

    解析网页就是从服务器请求下来的网页数据中提取出我们需要的数据,常用的有三种方法:正则表达式解析网页.BeautifulSoup和lxml. 一.使用正则表达式解析网页 正则表达式就是对字符串操作的一种 ...

  9. python网页结构分析_Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

最新文章

  1. RMAN Backups
  2. 不用重装系统,Win7下直接开启ACHI
  3. python叫什么-又一个python小游戏,叫什么不知道了。。。
  4. SM32的USART串口设置
  5. 水瓶座和什么座最配:天秤座,双子座,狮子座
  6. Objects.equals 有坑!!!
  7. 云海轻站V 1.0.17+智慧文章1.0.1插件(公众号同步官方最新版)
  8. 勒索软件再次降临 教育网为什么成为重灾区
  9. Kubernetes 弃用 Docker !
  10. 一加6体验深度测评:一款性价比极高的旗舰
  11. Android.Oldboot.1,腾讯手机管家发布全球首款可根除Oldboot病毒专杀
  12. 用sk-learn实现新闻的分类预测(完整代码)
  13. 思科ccna认证工程师必看路由协议IGRP和EIGRP详解
  14. 如何设计登录注册模块
  15. 月嫂的薪资为啥这么HIGH!
  16. MIT Technology Review 2020年“十大突破性技术”解读 【中国科学基金】2020年第3期发布...
  17. ROS同时订阅多个话题 Python
  18. 高端家政保洁服务网站搭建模板
  19. 《茅山后裔》全集(叶欣周铁版),MP3完整资源下载
  20. 虚拟环境mkvirtualenv指令

热门文章

  1. JDK8新特性之Stream流
  2. 深度学习与计算机视觉系列(8)_神经网络训练与注意点
  3. 比特币官网管理者因支持BCH被建议移交权限
  4. 画原型时需要注意什么?
  5. Linux下connect超时处理
  6. java基础面试题:抽象类中是否可以有静态的main方法?
  7. Windows下使用explorer批量下载文件
  8. $(document).ready()和window.onload的区别
  9. 怎样在多线程中使用JNI?
  10. js使用cookie