- 浏览: 271725 次
- 性别:
- 来自: 黑龙江省
文章分类
最新评论
-
leipan19890705:
AS调用JS里的呢?有没有?我的一直不成功。
JavaScript与ActionScript交互简单实例 -
newLinuxJava:
补充一下,windows7 日志配置文件的位置:Microso ...
Flex debug环境构建 -
ye_wx:
要加哪些jar包呢?麻烦列出来行吗
Java---POI--操作PPT -
brightACE:
不错,学习了
JavaScript与ActionScript交互简单实例 -
se7en8974:
留个言,回去看看。
推荐一个学习Flex chart的好网站
HTMLParser 使用详解
HTMLParser 具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。对于初学者还是要费一些功夫的,而一旦上手以后,会发现 HTMLParser 的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。
这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习 HTMLParser 的朋友们有所帮助。(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)
HTMLParser 的核心模块是 org.htmlparser.Parser 类, 这个类实际完成了对于 HTML 页面的分析工作 。这个类有下面几个构造函数:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
和一个静态类 public static Parser createParser (String html, String charset);
对于大多数使用者来说,使用最多的是通过一个 URLConnection 或者一个保存有网页内容的字符串来初始化 Parser ,或者使用静态函数来生成一个 Parser 对象。 ParserFeedback 的代码很简单, 是针对调试和跟踪分析过程的 ,一般不需要改变。 而使用 Lexer 则是一个相对比较高级的话题 ,放到以后再讨论吧。
这里比较有趣的一点是, 如果需要设置页面的编码方式的话 ,不使用 Lexer 就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。
下面是初始化 Parser 的例子。
package com.baizeju.htmlparsertester;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import org.htmlparser.visitors.TextExtractingVisitor;
import org.htmlparser.Parser;
/**
* @author www.baizeju.com
*/
public class Main {
private static String ENCODE = "GBK";
private static void message( String szMsg ) {
try{System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("file.encoding"))); } catch(Exception e ){}
}
public static String openFile( String szFileName ) {
try {
BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE ) );
String szContent="";
String szTemp;
while ( (szTemp = bis.readLine()) != null) {
szContent+=szTemp+"\n";
}
bis.close();
return szContent;
}
catch( Exception e ) {
return "";
}
}
public static void main(String[] args) {
String szContent = openFile( "E:/My Sites/HTMLParserTester.html");
try{
//Parser parser = Parser.createParser(szContent, ENCODE);
//Parser parser = new Parser( szContent );
Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );
TextExtractingVisitor visitor = new TextExtractingVisitor ();
parser. visitAllNodesWith ( visitor );
String textInPage = visitor.getExtractedText();
message(textInPage);
}
catch( Exception e ) {
}
}
}
加重的部分测试了几种不同的初始化方法,后面的显示了结果。大家看到能 Parser 出内容就可以了,如何操作访问 Parser 的内容我们在后面讨论。
HTMLParser 将解析过的信息保存为一个树的结构。 Node 是信息保存的数据类型基础 。
请看 Node 的定义:
public interface Node extends Cloneable;
Node 中包含的方法有几类:
对于树型结构进行遍历的函数 ,这些函数最容易理解:
Node getParent () : 取得父节点
NodeList getChildren () : 取得子节点的列表
Node getFirstChild () : 取得第一个子节点
Node getLastChild () : 取得最后一个子节点
Node getPreviousSibling () : 取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node getNextSibling () : 取得下一个兄弟节点
取得 Node 内容的函数 :
String getText () : 取得文本
String toPlainTextString () : 取得纯文本信息 。
String toHtml () : 取得 HTML 信息(原始 HTML )
String toHtml (boolean verbatim) : 取得 HTML 信息(原始 HTML )
String toString () : 取得字符串信息(原始 HTML )
Page getPage () : 取得这个 Node 对应的 Page 对象
int getStartPosition () : 取得这个 Node 在 HTML 页面中的起始位置
int getEndPosition () : 取得这个 Node 在 HTML 页面中的结束位置
用于 Filter 过滤的函数:
void collectInto (NodeList list, NodeFilter filter) : 基于 filter 的条件对于这个节点进行过滤,符合条件的节点放到 list 中。
用于 Visitor 遍历的函数:
void accept (NodeVisitor visitor) : 对这个 Node 应用 visitor
用于修改内容的函数,这类用得比较少 :
void setPage (Page page) : 设置这个 Node 对应的 Page 对象
void setText (String text) : 设置文本
void setChildren (NodeList children) : 设置子节点列表
其他函数 :
void doSemanticAction () : 执行这个 Node 对应的操作(只有少数 Tag 有对应的操作)
Object clone () : 接口 Clone 的抽象函数。
实际我们用 HTMLParser 最多的是处理 HTML 页面, Filter 或 Visitor 相关的函数是必须的,然后第一类和第二类函数是用得最多的。第一类函数比较容易理解,下面用例子说明一下第二类函数。
下面是用于测试的 HTML 文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title> 白泽居 -www.baizeju.com</title></head>
<html xmlns="http://www.w3.org/1999/xhtml">
<body >
<div id="top_main">
<div id="logoindex">
<!-- 这是注释 -->
白泽居 -www.baizeju.com
<a href="http://www.baizeju.com"> 白泽居 -www.baizeju.com</a>
</div>
白泽居 -www.baizeju.com
</div>
</body>
</html>
测试代码:
/**
* @author www.baizeju.com
*/
package com.baizeju.htmlparsertester;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import org.htmlparser.Node;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.Parser;
/**
* @author www.baizeju.com
*/
public class Main {
private static String ENCODE = " GBK ";
private static void message( String szMsg ) {
try{ System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("file.encoding"))); } catch(Exception e ){}
}
public static String openFile ( String szFileName ) {
try {
BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE) );
String szContent="";
String szTemp;
while ( (szTemp = bis.readLine()) != null) {
szContent+=szTemp+"\n";
}
bis.close();
return szContent;
}
catch( Exception e ) {
return "";
}
}
public static void main(String[] args) {
try{
Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );
for (NodeIterator i = parser.elements (); i.hasMoreNodes(); ) {
Node node = i.nextNode();
message("getText:"+node.getText());
message("getPlainText:"+node.toPlainTextString());
message("toHtml:"+node.toHtml());
message("toHtml(true):"+node.toHtml(true));
message("toHtml(false):"+node.toHtml(false));
message("toString:"+node.toString());
message("=================================================");
}
}
catch( Exception e ) {
System.out.println( "Exception:"+e );
}
}
}
输出结果:
getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
getPlainText:
toHtml:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
toHtml(true):<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
toHtml(false):<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
toString:Doctype Tag : !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd; begins at : 0; ends at : 121
=================================================
getText:
getPlainText:
toHtml:
toHtml(true):
toHtml(false):
- HTMLParser使用详解.rar (55.6 KB)
- 下载次数: 12
发表评论
-
myeclipse8.5 运行程序报错 java.lang.OutOfMemoryError
2012-04-11 20:21 1081myeclipse8.5 运行程序报错 java.lang. ... -
权限管理模型
2012-01-10 17:24 1216转载来源http://www.cnblo ... -
【自然框架】之通用权限:用PowerDesigner重新设计了一下数据库,有ER图和表关系图
2012-01-10 16:52 6542转自 http://www.cnblogs.com/ ... -
查看mysql 连接数
2011-07-20 14:47 14031、查看当前所有连接的详细资料: mysqladmin -u ... -
tomcat5.5如何修改分配给Java虚拟机的内存
2011-07-04 11:07 1646tomcat5.5如何修改分配给Java虚拟机的内存 ... -
tomcat实现SSL配置
2011-06-27 15:27 1125tomcat实现SSL配置 编辑tomcat的配置文件serv ... -
SQL 左外连接,右外连接,全连接,内连接
2011-06-26 11:11 1867SQL 左外连接,右外连接,全连接,内连接 ... -
dwr实现文件的下载--已经解决中文文件名乱码问题
2011-06-12 19:49 4201package com.wabacusdemo.u ... -
openflashchartdemo
2012-02-16 21:56 1028openflashchartdemo -
Apache HttpClient模拟登录
2011-01-17 21:46 2033Apache HttpClient模拟登录 Http ... -
使用HttpClient模拟网站登陆sina邮箱(保持远程服务器session和cookie)
2011-01-17 21:45 3875使用HttpClient模拟网站登陆sina邮箱(保持远程服 ... -
HttpClient的使用
2011-01-17 21:44 1040HttpClient 简介 HTTP 协议可能是现在 ... -
servlet利用filter实现登录过滤
2010-09-03 00:30 1279登录过滤类loginFilter----- ... -
log 4j配置详解
2010-08-06 01:00 1515web.xml中的配置 <!-- 以下是配置lo ... -
java 操作excel
2010-07-31 23:13 8211 从Excel文件读取数据 ... -
Java通用权限控制算法(转)
2010-06-20 22:48 1015转摘 一种常用的权限控制算法的实现,参考LIN ... -
Java---POI--操作PPT
2010-06-19 18:24 3494一, 解析PPT文件中的图片 Java代码 ... -
js写的日期控件
2009-03-19 02:44 885http://www.my97.net/dp/demo/ -
mysql添加新用户并且分配权限
2009-03-07 00:13 1276bin>mysql -u rootmysql> g ... -
MySql 数据的备份与恢复
2009-02-16 18:27 996window mysql命令 前提:通过cmd进入dos,进 ...
相关推荐
HTMLParser使用详解.doc如何利用JAVA实现对html的解析
除了正则表达式,本话题还提到了HTMLParser的使用。HTMLParser是一个Java库,用于解析HTML文档,提取或修改数据。它可以处理HTML标签、属性、文本等内容,对网页内容进行分析和操作。使用HTMLParser,开发者可以方便...
使用HTMLParser,开发者可以通过事件驱动的方式解析HTML,监听并响应特定的HTML元素和属性,从而实现对HTML内容的定制化处理。 结合两者,Java正则表达式可以与HTMLParser一起工作,帮助在解析HTML时进行更复杂的...
以下是一个使用 HTMLParser 解析本地文件的简单示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; import java.io.File; import java.net....
4. **分组与反向引用**:使用圆括号`()`可以将一部分表达式分组,方便多次使用或获取子匹配结果。反向引用如`\1`代表第一个分组匹配到的内容。 5. **预查否定**:`^`在方括号`[]`内表示否定,如`[^abc]`匹配非a、b...
4. 使用示例:在"HTMLParser使用详解-Node内容.doc"中,可能详细介绍了如何创建和配置解析器对象,设置解析事件处理器,以及如何通过遍历节点来提取或修改HTML内容。例如,可以使用`TagStart`事件捕获元素开始,`...
- `HTMLParser使用详解.doc`: 这份文档可能会深入解析HTMLParser的使用方法,包括高级功能和技巧。 - `HTMLParser使用举例.doc`: 提供了具体的使用案例,帮助理解如何在实际项目中应用HTMLParser。 在学习和使用...
- "HtmlParser使用详解.doc":深入讲解HtmlParser的各个方面,包括配置、事件处理器的编写、错误处理等。 - "HtmlParser学习笔记总结.doc":对学习过程的总结,可能包含常见问题解答和最佳实践。 - "yanghaisheng....
### JAVA HtmlParser 使用实例详解 在Java开发过程中,解析HTML文档是一项常见的需求,尤其是在处理Web爬虫、数据抓取等应用场景时。`HtmlParser`库为开发者提供了一种简便的方式来解析HTML文档,并从中提取所需的...
`HTMLParser使用详解.doc`和`HTMLParser使用举例.doc`可以提供更深入的指导。 5. **HttpClient库**:Apache HttpClient库是Java中用于发送HTTP请求的流行工具。它可以用来模拟登录,通过设置Cookie管理器来跟踪和...
**HtmlParser 2.1 知识点详解** HtmlParser是一个强大的开源库,主要用于解析HTML文档,它在处理不规则的HTML结构时表现出了极高的灵活性和稳定性。这个"HtmlParser 2.1 码源"是该库的2015年6月的最新版本,包含了...
《C# HTMLParser详解及其应用》 在编程领域,处理HTML文档是一项常见的任务,尤其是在Web开发中。C#作为微软推出的面向对象的编程语言,拥有丰富的库和工具来支持这项工作。本文将深入探讨C#中的HTMLParser,以及...
### 使用HttpClient和HtmlParser实现简易爬虫的知识点详解 #### 一、HttpClient与HtmlParser简介 **HttpClient简介:** HttpClient是Jakarta Commons项目中的一个重要组件,用于提供灵活且高效的HTTP协议支持。它...
以下是一个简单的网页抓取示例,用于演示如何使用HTMLParser从指定URL抓取页面并保存到本地文件: ```java import java.io.*; import java.net.*; import org.htmlparser.Parser; public class ScrubSelectedWeb {...