该类并不是一个通用的工具类,需要按自己的要求实现,这里只记录了Htmlparse.jar包的一些用法。仅此而已!
详细看这里:http://gundumw100.iteye.com/blog/704311

import java.util.*;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.BodyTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException; /**
* httpclient与htmlparse对网页的解析
*
* @author Administrator
*
*/
public class HtmlparseUtil {
WebHttpClient util=new WebHttpClient();
/**
* 获得网页中的超链接,将href和text保存在Map中:map(href,text)
* @param url
* @param charset
* @return
*/
public Map<String, String> linkGet(String url, String charset) {
String content=util.getWebContentByGet(url,charset);
Map<String, String> linkMap = new HashMap<String, String>();
try {
//开始解析
Parser parser = Parser.createParser(content, charset);
// 过滤出<a></a>标签
NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
Node node = null;
for (int i = 0; i < list.size(); i++) {
node = list.elementAt(i);
// 获得网页中的链接map(href,text)
linkMap.put(((LinkTag) node).getLink(), this.processText(((LinkTag) node).getLinkText()));
}
} catch (ParserException e) {
e.printStackTrace();
}
return linkMap;
} /**
* 获得网页<body></body>标签中的内容, 保存在body中
* @param url
* @param charset
* @return
*/
public String bodyGet(String url, String charset) {
String content=util.getWebContentByGet(url,charset);
String body = "";
try {
Parser parser = Parser.createParser(content, charset);
// 过滤<body></body>标签
NodeFilter bodyFilter = new NodeClassFilter(BodyTag.class);
NodeList list = parser.extractAllNodesThatMatch(bodyFilter);
Node node = null;
for (int i = 0; i < list.size(); i++) {
node = list.elementAt(i);
// 获得网页内容 保存在content中
body = ((BodyTag) node).getBody();
}
} catch (ParserException e) {
e.printStackTrace();
}
return body;
} /**
* 过滤出class为term的<span>元素,并获得他们的文本
* @param url
* @param charset
* @return
*/
public Map<String,String> termGet(String url, String charset) {
String content=util.getWebContentByGet(url,charset); Map<String, String> map = new HashMap<String, String>();
try {
//开始解析
// 过滤出class为term的<span>元素
Parser parser = Parser.createParser(content, charset);
AndFilter filter =
new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("class","term")); Node node = null;
NodeList nodeList = parser.parse(filter); for (int i = 0; i < nodeList.size(); i++) {
node = nodeList.elementAt(i);
map.put("term", node.toPlainTextString());
}
// 过滤出class为start-time的<span>元素
Parser parser2 = Parser.createParser(content, charset);
AndFilter filter2 =
new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("class","start-time"));
NodeList nodeList2 = parser2.parse(filter2);
for (int i = 0; i < nodeList2.size(); i++) {
node = nodeList2.elementAt(i);
map.put("start-time", node.toPlainTextString());
}
// 过滤出id为J_SingleEndTimeLabel的<span>元素
Parser parser3 = Parser.createParser(content, charset);
AndFilter filter3 =
new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("id","J_SingleEndTimeLabel"));
NodeList nodeList3 = parser3.parse(filter3);
for (int i = 0; i < nodeList3.size(); i++) {
node = nodeList3.elementAt(i);
map.put("end-time", node.toPlainTextString());
} // 过滤出class为box post的<div>元素
Parser parser4 = Parser.createParser(content, charset);
AndFilter filter4 =
new AndFilter(new TagNameFilter("div"),new HasAttributeFilter("class","box post"));
NodeList nodeList4 = parser4.parse(filter4);
for (int i = 0; i < nodeList4.size(); i++) {
node = nodeList4.elementAt(i);
String temp=node.toPlainTextString().trim();
temp=temp.substring(10,20).trim();
map.put("pre-term", temp);
} // 过滤出class为J_AwardNumber的<span>元素
Parser parser5 = Parser.createParser(content, charset);
// AndFilter filter5 =
// new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("class","J_AwardNumber"));
NodeList nodeList5 = parser5.parse(new HasAttributeFilter("class","J_AwardNumber"));
StringBuffer buffer=new StringBuffer();
for (int i = 0; i < nodeList5.size(); i++) {
node = nodeList5.elementAt(i);
buffer.append(","+node.toPlainTextString());
}
buffer.append("|"); // 过滤出class为blue J_AwardNumber的<span>元素
Parser parser6 = Parser.createParser(content, charset);
// AndFilter filter6 =
// new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("class","blue J_AwardNumber"));
NodeList nodeList6 = parser6.parse(new HasAttributeFilter("class","blue J_AwardNumber"));
for (int i = 0; i < nodeList6.size(); i++) {
node = nodeList6.elementAt(i);
buffer.append(node.toPlainTextString()+",");
} map.put("numbers", buffer.toString());
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return map;
} private String processText(String content){
content=content.trim().replaceAll("&nbsp;", "");
// content=content.replaceAll("<p>", "\n");
// content=content.replaceAll("</TD>", "");
// content=content.replaceAll("</div>", "");
// content=content.replaceAll("</a>", "");
// content=content.replaceAll("<a href=.*>", "");
return content;
} public static void main(String[] str) { String url="http://caipiao.taobao.com/lottery/order/lottery_dlt.htm?type=1";
HtmlparseUtil util=new HtmlparseUtil();
Map<String,String> map=util.termGet(url, "gb2312");
System.out.println("term="+map.get("term"));//<span class="term">第<em>10074</em>期</span>
System.out.println("start-time="+map.get("start-time"));//
System.out.println("end-time="+map.get("end-time"));//
System.out.println("pre-term="+map.get("pre-term"));//
System.out.println("numbers="+map.get("numbers"));// /*
Map<String, String> linkMap = util.linkGet(url, "gb2312");
for (String s : linkMap.keySet()) {
System.out.println(s + " = " + linkMap.get(s));
//如果是个链接,则再获取它的<body>中的内容
// if (s.startsWith("http")) {
// util.bodyGet(s, "gb2312");
// }
}
*/ } }

HtmlparseUtil.java的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

随机推荐

  1. Postfix性能测试(PHP版)

    Postfix的性能压测(PHP版) 发送测试:分别使用PHP Mail()函数和PHPMailler smtp协议发送邮件, 推送速率是指 发送个数/PHP程序运行时间, 发送速率是指 发送个数/( ...

  2. OCR文字识别软件许可文件被误删了怎么办

    使用任何一款软件,都会有误操作的情况发生,比如清理文件时一不小心删除了许可文件,对于ABBYY FineReader 12这样一款OCR文字识别软件,因失误错误删除了许可文件该怎么办呢?今天就来给大家 ...

  3. SQL 语句中的With(index())

    SELECT m.Member_No, m.FirstName, m.Region_No FROM dbo.Member AS m WITH (INDEX (0))   强制使用找到的第一个索引. 其 ...

  4. ASP.NET MVC中的拦截器

    在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器, 所谓的拦截器也没有什么的,只是写一个类,继承另一个类和一个接口,顺便实现接口里面的方法而以 ...

  5. kubernetes centos 安装

    1.  安装       yum install -y  etcd  kubernetes   2.  配置         docker             /etc/sysconfig/doc ...

  6. linux下安装svn

    linux下SVN服务器如何搭建和使用 | 浏览:12117 | 更新:2013-09-18 14:28 | 标签:linux linux下SVN服务器如何搭建和使用?说到SVN服务器,想必大家都知道 ...

  7. pt-heartbeat使用实践

    今天无意中看到了沃趣网络科技的一篇文章请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间感觉分析的相当不错,该文章中也提到了使用pt-heartbeat这个工具检测主从延 ...

  8. IOS开发-UI基础-视图

    //------------------------------UIWindow--------------------------// 1.UIWindow:是 UIView 的子类,用于管理.协调 ...

  9. SPOJ #10657. LOGIC (riddle)

    1 line in Ruby(2.0), 36B: p (1..n=gets.to_i).reduce(:*)+2**n-n

  10. Bower => 前端开发也有包管理器

    摘要: 一直以来npm,pip等各种包管理器好像都和前端开发没什么太大关系,当然因为nodejs的原因可能感觉npm会亲切一些,不过终归不是针对客户端的包管理工作,所以Bower的出现确实让人眼前一亮 ...