1、 简介
htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它提供了接口,支持线性和嵌套HTML文本。在实际的项目中只需要将htmlparser.jar 导入classpath中,就可以使用HTMLParser提供的API了。
2、 主要应用
HTML Parser项目主要可以用在以下两个方面:
1). 信息提取
· 文本信息抽取,例如对HTML进行有效信息搜索
· 链接提取,用于自动给页面的链接文本加上链接的标签
· 资源提取,例如对一些图片、声音的资源的处理
· 链接检查,用于检查HTML中的链接是否有效
· 页面内容的监控
2). 信息转换
· 链接重写,用于修改页面中的所有超链接
· 网页内容拷贝,用于将网页内容保存到本地
· 内容检验,可以用来过滤网页上一些令人不愉快的字词
· HTML信息清洗,把本来乱七八糟的HTML信息格式化
· 转成XML格式数据
3、 数据组织分析
HTML有3种类型的节点:RemarkNode:html中的注释,TagNode:标签节点,TextNode:文本节点。HTMLParser将读取的二进制数据流,进行编码转换、词法分析等操作,生成树形层次结构的Node节点集合。
HtmlParser主要靠Node和Tag来表达Html。
Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法 ,定义了Visitor访问机制。AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方 法,使得它的子类,不用理会具体的树操作。
Node分成三类:
§ RemarkNode:代表Html中的注释
§ TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
§ TextNode:文本节点
Tag是具体分析的主要内容。Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类 ;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。
4、Visitor方式访问Html:
(1)、整体解析过程
§ 用一个URL或页面String做一个Parser
§ 用这个Parser做一个Visitor
§ 使用Parser.visitAllNodeWith(Visitor)来遍历节点
§ 获取Visitor遍历后得到的数据
(2)、系统Visitor功能简介:
§ ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。
§ StringBean:用来从一个指定的URL获取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。
§ HtmlPage:提取Title,body中的节点和页面中的TableTag节点。
§ LinkFindingVisitor:找出节点中包含某个链接的总个数。
§ StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。
§ TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。
§ TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的 ,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的链接也去掉了。
§ UrlModifyingVisitor:用来修改网页中的链接。
(3)、Filter
如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。
系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。
Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
Node[] nodes = nodeList.toNodeArray();
来获取节点数组,也可以直接访问:
Node node = nodeList.elementAt(i)来获取Node。
另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch (someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。
这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。
5、乱码问题
对于HTMLParser 工具包我们需要修改其中的htmlparser.java文件使其适用中文的html文件分析。htmlparser.java文件中具体实现细节就不再介绍。这里主要是把protected static final String DEFAULT_CHARSET = "ISO-8859-1";修改成protected static final String DEFAULT_CHARSET = "gb2312";因为采用默认的字符集"ISO-8859-1"对含有中文的html文件进行分析的时候就会出现乱码。必须进行new String(str.getBytes("ISO-8859-1"),"GB2312")的转换工作。对于修改好的htmlparser工具包,需要重新压缩成.jar文件,放到jdk的工作环境中。
分享到:
相关推荐
网络爬虫,也称为网络蜘蛛或Web抓取器,是一种自动浏览互联网并收集信息的程序。它广泛应用于搜索引擎优化、数据分析、市场研究等多个领域。 在Python中,HTMLParser是内置的HTML解析器,它允许开发者编写自定义的...
`htmlParser收集记录 - 记忆有问题!!! - CSDN博客.htm`和`HtmlParser初步研究 - lostfire - BlogJava.htm`这类博客文章,通常由开发者分享他们的学习心得和实践经验,可能包括一些常见问题的解决方法、技巧或最佳...
在`endElement`中,我们处理完一个元素的内容,可能包括收集数据或结束数据的记录。 值得注意的是,网络爬虫在抓取数据时需要遵守网站的robots.txt协议,尊重网站的版权和用户隐私,避免过于频繁的请求导致服务器...
2. **设置处理器**:创建一个自定义的处理器类,覆盖HTMLParser中的方法。例如,我们可以重写startElement()方法,当遇到`<img>`标签时,提取`src`属性,即图片的URL。 3. **启动爬虫**:调用HTMLParser的parse()...
网络爬虫是自动抓取网页信息的程序,它在互联网上遍历网页,收集所需数据。在实现网络爬虫时,高效地管理待抓取URL(统一资源定位符)是关键。这里,我们讨论如何使用堆栈和队列来优化这一过程。 首先,让我们了解...
2. **HtmlParser.jar**: HtmlParser是一个解析HTML文档的库,它可以解析HTML文档并转换为DOM树结构,便于程序处理和提取所需信息。在网络爬虫中,我们通常需要解析抓取到的HTML页面,提取出如标题、链接、文本内容等...
为了能够有效地收集这些信息,并构建起一套高效的信息搜索引擎,本项目设计并实现了一种专门针对淘宝网站的网络爬虫系统。 #### 二、关键技术与框架选择 ##### 1. HtmlParser - **概述**:此开源框架主要用于解析...
网络爬虫是一种自动抓取互联网信息的程序,它按照一定的规则在网站上遍历网页,收集所需的数据。在Java编程语言中,实现一个简单的网络爬虫并不复杂,主要涉及到的技术包括HTTP请求、HTML解析、数据存储等。 1. **...
2. utility.cs.bak 和 utility.cs:这些可能是工具类文件,包含了一些通用功能,如日志记录、配置读写、异常处理等。 3. ParseHTML.cs 和 Parse.cs:这些文件负责解析HTML文档,提取出有用信息。它们可能包含了HTML...
在实例中,URL管理器维护了两个集合,`new_urls`用于存储待爬取的URL,`old_urls`记录已抓取的URL。当需要新的URL时,它会从`new_urls`中取出一个并转移到`old_urls`。 2. **网页下载器(UrlDownloader)**:从给定...
这些智能代理能够在无需人工干预的情况下在网络上执行任务,如搜集特定主题的信息、在单一网站内检索信息,以及从多个来源收集数据并整合到单个页面上。书中不仅涵盖了基础的HTTP/网络编程知识,还深入探讨了如何...
这可能涉及DOM(Document Object Model)解析,如使用HTMLParser库,或者正则表达式匹配来提取特定格式的邮件地址。 4. **数据存储**:抓取到的邮件信息可能需要存储,这可能涉及到数据库操作,如SQLite、MySQL或...
在当今互联网时代,网络爬虫作为一种高效的数据收集工具,在大数据分析、搜索引擎优化、市场调研等多个领域发挥着重要作用。Java作为一门广泛应用于服务器端开发的语言,自然成为了构建网络爬虫系统的热门选择之一。...
在IT领域,网络爬虫(spider)是一种用于自动化地从互联网上收集信息的程序。本项目是一个基于Java实现的网站抓取程序,利用多线程技术和HTML解析技术,同时具备防屏蔽功能,以高效、稳定的方式从目标网站获取数据。...
9. **日志记录**:为了便于调试和监控,爬虫应该有日志记录功能,记录爬取过程中的关键信息。 10. **数据存储**:下载的文件可能需要存储到本地文件系统或者数据库中,这涉及到了数据存储和组织策略。 总的来说,...
网络爬虫是自动收集网络信息的程序,它可以按照某种规则,自动地抓取互联网信息。而Tornado是一个Python开源的异步网络框架,适用于需要处理高并发的场景,非常适合用来编写网络爬虫程序。 首先,要使用Tornado框架...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...