- 浏览: 87423 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qintengfei:
不错,问题解决了。
ResultSet转换为List的方法 -
weichen:
看完之后挺管用,拿来试试人人网,大部分应用都能进,但是游戏中的 ...
HttpClient -
nggno1:
学习了~
Date类学习总结 -
chen88358323:
httpclient.getConnectionManager ...
HttpClient关于下载的资料收集 -
Eric_2007:
最后一条,有点过份!
一个女生看了会哭,男生会沉默的故事
需要做一个垂直搜索引擎,比较了nekohtml和htmlparser 的功能,尽管nekohtml在容错性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感觉 nekohtml的测试用例和文档都比htmlparser都少,而且htmlparser基本上能够满足垂直搜索引擎页面处理分析的需求,因此先研究一下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。
html的功能还是官方说得最为清楚,
The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.
研究的重点还是extraction的使用,有空再研究transformation的使用。
1、htmlparser对html页面处理的数据结构
如图所示,HtmlParser采用了经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素。
* org.htmlparser.Node:
Node接口定义了进行树形结构节点操作的各种典型操作方法,包括:
节点到html文本、text文本的方法:toPlainTextString、toHtml
典型树形结构遍历的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText
获取节点对应的树形结构结构的顶级节点Page对象方法:getPage
获取节点起始位置的方法:getStartPosition、getEndPosition
Visitor方法遍历节点时候方法:accept (NodeVisitor visitor)
Filter方法:collectInto (NodeList list, NodeFilter filter)
Object方法:toString、clone
* org.htmlparser.nodes.AbstractNode:
AbstractNode是形成HTML树形结构抽象基类,实现了Node接口。
在htmlparser中,Node分成三类:
RemarkNode:代表Html中的注释
TagNode:标签节点。
TextNode:文本节点
这三类节点都继承AbstractNode。
* org.htmlparser.nodes.TagNode:
TagNode包含了对HTML处理的核心的各个类,是所有TAG的基类,其中有分为包含其他TAG的复合节点ComositeTag和不包含其他TAG的叶子节点Tag。
复合节点CompositeTag:
AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,
HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,
TableHeader,TableRow,TableTag,TextareaTag,TitleTag
叶子节点TAG:
BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser对html页面处理的算法
主要是如下几种方式
引用
HTML Parser is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.
The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.
研究的重点还是extraction的使用,有空再研究transformation的使用。
1、htmlparser对html页面处理的数据结构
- * 采用Visitor方式访问Html
- try {
- Parser parser = new Parser();
- parser.setURL(”http://www.google.com”);
- parser.setEncoding(parser.getEncoding());
- NodeVisitor visitor = new NodeVisitor() {
- public void visitTag(Tag tag) {
- logger.fatal(”testVisitorAll() Tag name is :”
- + tag.getTagName() + ” \n Class is :”
- + tag.getClass());
- }
- };
- parser.visitAllNodesWith(visitor);
- } catch (ParserException e) {
- e.printStackTrace();
- }
- * 采用Filter方式访问html
- try {
- NodeFilter filter = new NodeClassFilter(LinkTag.class);
- Parser parser = new Parser();
- parser.setURL(”http://www.google.com”);
- parser.setEncoding(parser.getEncoding());
- NodeList list = parser.extractAllNodesThatMatch(filter);
- for (int i = 0; i < list.size(); i++) {
- LinkTag node = (LinkTag) list.elementAt(i);
- logger.fatal(”testLinkTag() Link is :” + node.extractLink());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- * 采用org.htmlparser.beans方式
- 另外htmlparser 还在org.htmlparser.beans中对一些常用的方法进行了封装,以简化操作,例如:
- Parser parser = new Parser();
- LinkBean linkBean = new LinkBean();
- linkBean.setURL(”http://www.google.com”);
- URL[] urls = linkBean.getLinks();
- for (int i = 0; i < urls.length; i++) {
- URL url = urls[i];
- logger.fatal(”testLinkBean() -url is :” + url);
- }
- 3、htmlparser关键包结构说明
- htmlparser其实核心代码并不多,好好研究一下其代码,弥补文档不足的问题。同时htmlparser的代码注释和单元测试用例还是很齐全的,也有助于了解htmlparser的用法。
- 3.1、org.htmlparser
- 定义了htmlparser的一些基础类。其中最为重要的是Parser类。
- Parser是htmlparser的最核心的类,其构造函数提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)
- 各构造函数的具体用法及含义可以查看其代码,很容易理解。
- Parser常用的几个方法:
- * elements获取元素
- Parser parser = new Parser (”http://www.google.com”);
- for (NodeIterator i = parser.elements (); i.hasMoreElements (); )
- processMyNodes (i.nextNode ());
- * parse (NodeFilter filter):通过NodeFilter方式获取
- * visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
- * extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式
- 3.2、org.htmlparser.beans
- 对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。
- 包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。
- 3.3、org.htmlparser.nodes
- 定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。
- 3.4、org.htmlparser.tags
- 定义了htmlparser的各种tag。
- 3.5、org.htmlparser.filters
- 定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter
- 3.6、org.htmlparser.visitors
- 定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor
- 3.7、org.htmlparser.parserapplications
- 定义了一些实用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,这几个类也可以作为htmlparser使用样例。
- 3.8、org.htmlparser.tests
- 对各种功能的单元测试用例,也可以作为htmlparser使用的样例。
- 4、htmlparser的使用样例
- import java.net.URL;
- import junit.framework.TestCase;
- import org.apache.log4j.Logger;
- import org.htmlparser.Node;
- import org.htmlparser.NodeFilter;
- import org.htmlparser.Parser;
- import org.htmlparser.Tag;
- import org.htmlparser.beans.LinkBean;
- import org.htmlparser.filters.NodeClassFilter;
- import org.htmlparser.filters.OrFilter;
- import org.htmlparser.filters.TagNameFilter;
- import org.htmlparser.tags.HeadTag;
- import org.htmlparser.tags.ImageTag;
- import org.htmlparser.tags.InputTag;
- import org.htmlparser.tags.LinkTag;
- import org.htmlparser.tags.OptionTag;
- import org.htmlparser.tags.SelectTag;
- import org.htmlparser.tags.TableColumn;
- import org.htmlparser.tags.TableRow;
- import org.htmlparser.tags.TableTag;
- import org.htmlparser.tags.TitleTag;
- import org.htmlparser.util.NodeIterator;
- import org.htmlparser.util.NodeList;
- import org.htmlparser.util.ParserException;
- import org.htmlparser.visitors.HtmlPage;
- import org.htmlparser.visitors.NodeVisitor;
- import org.htmlparser.visitors.ObjectFindingVisitor;
- public class ParserTestCase extends TestCase {
- private static final Logger logger = Logger.getLogger(ParserTestCase.class);
- public ParserTestCase(String name) {
- super(name);
- }
- /*
- * 测试ObjectFindVisitor的用法
- */
- public void testImageVisitor() {
- try {
- ImageTag imgLink;
- ObjectFindingVisitor visitor = new ObjectFindingVisitor(
- ImageTag.class);
- Parser parser = new Parser();
- parser.setURL(”http://www.google.com”);
- parser.setEncoding(parser.getEncoding());
- parser.visitAllNodesWith(visitor);
- Node[] nodes = visitor.getTags();
- for (int i = 0; i < nodes.length; i++) {
- imgLink = (ImageTag) nodes[i];
- logger.fatal(”testImageVisitor() ImageURL = “
- + imgLink.getImageURL());
- logger.fatal(”testImageVisitor() ImageLocation = “
- + imgLink.extractImageLocn());
- logger.fatal(”testImageVisitor() SRC = “
- + imgLink.getAttribute(”SRC”));
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 测试TagNameFilter用法
- */
- public void testNodeFilter() {
- try {
- NodeFilter filter = new TagNameFilter(”IMG”);
- Parser parser = new Parser();
- parser.setURL(”http://www.google.com”);
- parser.setEncoding(parser.getEncoding());
- NodeList list = parser.extractAllNodesThatMatch(filter);
- for (int i = 0; i < list.size(); i++) {
- logger.fatal(”testNodeFilter() ” + list.elementAt(i).toHtml());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 测试NodeClassFilter用法
- */
- public void testLinkTag() {
- try {
- NodeFilter filter = new NodeClassFilter(LinkTag.class);
- Parser parser = new Parser();
- parser.setURL(”http://www.google.com”);
- parser.setEncoding(parser.getEncoding());
- NodeList list = parser.extractAllNodesThatMatch(filter);
- for (int i = 0; i < list.size(); i++) {
- LinkTag node = (LinkTag) list.elementAt(i);
- logger.fatal(”testLinkTag() Link is :” + node.extractLink());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 测试<link href=” text=’text/css’ rel=’stylesheet’ />用法
- */
- public void testLinkCSS() {
- try {
- Parser parser = new Parser();
- parser
- .setInputHTML(”<head><title>Link Test</title>”
- + “<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />”
- + “<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />”
- + “</head>” + “<body>”);
- parser.setEncoding(parser.getEncoding());
- NodeList nodeList = null;
- for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {
- Node node = e.nextNode();
- logger
- .fatal(”testLinkCSS()” + node.getText()
- + node.getClass());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 测试OrFilter的用法
- */
- public void testOrFilter() {
- NodeFilter inputFilter = new NodeClassFilter(InputTag.class);
- NodeFilter selectFilter = new NodeClassFilter(SelectTag.class);
- Parser myParser;
- NodeList nodeList = null;
- try {
- Parser parser = new Parser();
- parser
- .setInputHTML(”<head><title>OrFilter Test</title>”
- + “<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />”
- + “<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />”
- + “</head>”
- + “<body>”
- + “<input type=’text’ value=’text1′ name=’text1′/>”
- + “<input type=’text’ value=’text2′ name=’text2′/>”
- + “<select><option id=’1′>1</option><option id=’2′>2</option><option id=’3′></option></select>”
- + “<a href=’http://www.yeeach.com’>yeeach.com</a>”
- + “</body>”);
- parser.setEncoding(parser.getEncoding());
- OrFilter lastFilter = new OrFilter();
- lastFilter.setPredicates(new NodeFilter[] { selectFilter,
- inputFilter });
- nodeList = parser.parse(lastFilter);
- for (int i = 0; i <= nodeList.size(); i++) {
- if (nodeList.elementAt(i) instanceof InputTag) {
- InputTag tag = (InputTag) nodeList.elementAt(i);
- logger.fatal(”OrFilter tag name is :” + tag.getTagName()
- + ” ,tag value is:” + tag.getAttribute(”value”));
- }
- if (nodeList.elementAt(i) instanceof SelectTag) {
- SelectTag tag = (SelectTag) nodeList.elementAt(i);
- NodeList list = tag.getChildren();
- for (int j = 0; j < list.size(); j++) {
- OptionTag option = (OptionTag) list.elementAt(j);
- logger
- .fatal(”OrFilter Option”
- + option.getOptionText());
- }
- }
- }
- } catch (ParserException e) {
- e.printStackTrace();
- }
- }
- /*
- * 测试对<table><tr><td></td></tr></table>的解析
- */
- public void testTable() {
- Parser myParser;
- NodeList nodeList = null;
- myParser = Parser.createParser(”<body> ” + “<table id=’table1′ >”
- + “<tr><td>1-11</td><td>1-12</td><td>1-13</td>”
- + “<tr><td>1-21</td><td>1-22</td><td>1-23</td>”
- + “<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>”
- + “<table id=’table2′ >”
- + “<tr><td>2-11</td><td>2-12</td><td>2-13</td>”
- + “<tr><td>2-21</td><td>2-22</td><td>2-23</td>”
- + “<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>”
- + “</body>”, “GBK”);
- NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
- OrFilter lastFilter = new OrFilter();
- lastFilter.setPredicates(new NodeFilter[] { tableFilter });
发表评论
-
工作记录
2010-03-08 11:26 777sqlserver2000 安装报注册表挂起解决: ... -
利用ftp服务器实现文件上传下载
2009-08-12 12:09 1527利用ftp服务器实现文件 ... -
hibernate 多条件组合查询 之 sql 拼接
2009-08-10 15:38 1886public static void main(String[ ... -
工作记录
2009-06-16 18:13 7741 用PrintWriter对象写文件 StringB ... -
控件通知消息
2009-05-05 13:49 19022008年04月06日 星期日 00:09 控件通知消 ... -
Hibernate的检索策略
2009-05-04 13:54 748Hibernate的检索策略包括类级别检索策略和关联级别检索策 ... -
ResultSet转换为List的方法
2009-04-11 20:39 2523ResultSet转换为List的方法 private s ... -
文件批量上传
2009-03-23 17:06 1148执行类: /** * @author LX ... -
工作异常记录
2009-03-20 18:44 8051 hbm.xml配置问题 org.springframewo ... -
Date类学习总结
2009-03-06 13:34 9671.计算某一月份的最大天数 Calendar time=Cal ... -
java日期(Date)、日历(Calendar)、日期格式(DateFormat)三类介绍
2009-02-16 13:45 2705语言的Calendar(日历),Date(日期), 和Date ... -
关于日期格式的一些记录
2009-02-16 13:43 894一、自定义月份: Date aDate = new Dat ... -
JAVA正则表达式4种常用功能
2009-02-12 10:31 916JAVA正则表达式4种常 ... -
list排序
2009-02-06 11:28 1052import java.text.Collator; ... -
java中删除一个非空目录的方法
2009-02-04 19:03 2946在java中没有直接删除非空目录的方法,所以要自己编写方法来删 ... -
List与数组实体的转换
2009-01-22 17:41 12491.List转换成为数组。(这里的List是实体是ArrayL ... -
HttpClient认证(3)
2009-01-15 10:59 1357清单 2. 在 HttpClient 中自定义 SSL 示例 ... -
HttpClient认证(2)
2009-01-15 10:47 2344Form-Based 认证方式在 J2EE 站点中更为常见。这 ... -
HttpClient认证(1)
2009-01-15 10:29 1457J2EE 站点认证简介 出于安全性的需要和用户授权管理的考虑 ... -
HttpClient 学习整理(4)
2009-01-15 10:05 15495. 提交XML格式参数
相关推荐
`htmlParser收集记录 - 记忆有问题!!! - CSDN博客.htm`和`HtmlParser初步研究 - lostfire - BlogJava.htm`这类博客文章,通常由开发者分享他们的学习心得和实践经验,可能包括一些常见问题的解决方法、技巧或最佳...
网络爬虫,也称为网络蜘蛛或Web抓取器,是一种自动浏览互联网并收集信息的程序。它广泛应用于搜索引擎优化、数据分析、市场研究等多个领域。 在Python中,HTMLParser是内置的HTML解析器,它允许开发者编写自定义的...
在`endElement`中,我们处理完一个元素的内容,可能包括收集数据或结束数据的记录。 值得注意的是,网络爬虫在抓取数据时需要遵守网站的robots.txt协议,尊重网站的版权和用户隐私,避免过于频繁的请求导致服务器...
爬虫是互联网数据挖掘的重要工具,它能够自动遍历网页并收集相关信息。 首先,我们需要理解HTMLParser的基本工作原理。HTMLParser通过监听器模式来解析HTML,当遇到特定的HTML标签时,会触发相应的事件。例如,当...
网络爬虫是自动抓取网页信息的程序,它在互联网上遍历网页,收集所需数据。在实现网络爬虫时,高效地管理待抓取URL(统一资源定位符)是关键。这里,我们讨论如何使用堆栈和队列来优化这一过程。 首先,让我们了解...
网络爬虫是自动抓取网页信息的程序,它可以帮助我们高效地收集大量数据,用于数据分析、网站监控或搜索引擎构建等目的。在这个主题中,我们关注的是编写网络爬虫时可能会用到的一些关键Java库,这些库包含在提供的...
为了能够有效地收集这些信息,并构建起一套高效的信息搜索引擎,本项目设计并实现了一种专门针对淘宝网站的网络爬虫系统。 #### 二、关键技术与框架选择 ##### 1. HtmlParser - **概述**:此开源框架主要用于解析...
网络爬虫是一种自动抓取互联网信息的程序,它按照一定的规则在网站上遍历网页,收集所需的数据。在Java编程语言中,实现一个简单的网络爬虫并不复杂,主要涉及到的技术包括HTTP请求、HTML解析、数据存储等。 1. **...
这种爬虫能够根据用户设定的“种子网站”(通常是某个或某些起始网页)和“主题词”(关键词或关键词集合)来搜索和收集相关信息。它的工作原理是遍历种子网站,并沿着网页间的链接扩展搜索范围,同时过滤和提取与...
这些智能代理能够在无需人工干预的情况下在网络上执行任务,如搜集特定主题的信息、在单一网站内检索信息,以及从多个来源收集数据并整合到单个页面上。书中不仅涵盖了基础的HTTP/网络编程知识,还深入探讨了如何...
在实例中,URL管理器维护了两个集合,`new_urls`用于存储待爬取的URL,`old_urls`记录已抓取的URL。当需要新的URL时,它会从`new_urls`中取出一个并转移到`old_urls`。 2. **网页下载器(UrlDownloader)**:从给定...
这可能涉及DOM(Document Object Model)解析,如使用HTMLParser库,或者正则表达式匹配来提取特定格式的邮件地址。 4. **数据存储**:抓取到的邮件信息可能需要存储,这可能涉及到数据库操作,如SQLite、MySQL或...
在IT领域,网络爬虫(spider)是一种用于自动化地从互联网上收集信息的程序。本项目是一个基于Java实现的网站抓取程序,利用多线程技术和HTML解析技术,同时具备防屏蔽功能,以高效、稳定的方式从目标网站获取数据。...
在当今互联网时代,网络爬虫作为一种高效的数据收集工具,在大数据分析、搜索引擎优化、市场调研等多个领域发挥着重要作用。Java作为一门广泛应用于服务器端开发的语言,自然成为了构建网络爬虫系统的热门选择之一。...
网络爬虫是自动收集网络信息的程序,它可以按照某种规则,自动地抓取互联网信息。而Tornado是一个Python开源的异步网络框架,适用于需要处理高并发的场景,非常适合用来编写网络爬虫程序。 首先,要使用Tornado框架...
9. **日志记录**:为了便于调试和监控,爬虫应该有日志记录功能,记录爬取过程中的关键信息。 10. **数据存储**:下载的文件可能需要存储到本地文件系统或者数据库中,这涉及到了数据存储和组织策略。 总的来说,...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...