`

HtmlparseUtil.java

阅读更多
该类并不是一个通用的工具类,需要按自己的要求实现,这里只记录了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");
//			}
		}
		*/
		
	}
	
}
分享到:
评论
3 楼 anybyb 2012-01-06  
终于找到了哈哈 试试去
2 楼 gundumw100 2011-12-23  
svygh123 写道
请问WebHttpClient是什么类呢,可以提供吗?谢谢

在这里http://gundumw100.iteye.com/blog/702521的WebClient类就是!
1 楼 svygh123 2011-12-22  
请问WebHttpClient是什么类呢,可以提供吗?谢谢

相关推荐

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用 ,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用。,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协议与数据加密,适用于多种物联网应用。,资料:4g GPRS DTU 开发板软件代码硬件图纸料包括:原理图,版图,单片机代码,sim800c官方资料 不含PCB板 本公司批产产品,已无故障运行数年 全套硬件图纸和软件代码。 程序比正点原子的可靠,军工级485电路。 NBIOT和4G等采用AT指令的均可参照此代码 GPRS具有比NBIOT更低的价格更好的网络,是目前低速物联网的主要通讯技术之一。 485转GPRS GPRS支持协议: TCP UDP HTTP-GET HTTP-POST FTP Md5数据加密 心跳包 电源部分,带共模电感,防反接二极管,Tvs管,5-30Vdc转5V和4V 485部分,硬件延时电路,可靠稳定 引出网络状态(兼电源)指示灯,收发指示灯,设置状态指示灯 微动按键设置工作状态 已预留LORA模块位置,若不用可将他的Io口改做他用,能引出一路串口,2路Io口 单片机

    scala-intellij-bin-2024.1.1.zip

    scala-intellij-bin-2024.1.1.zip

    基于Android的平台书架设计实现源码.zip

    基于Android的平台书架设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    (源码)基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用_1.zip

    # 基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用 ## 项目简介 这是一个基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗(BLE)应用程序的示例项目。项目包含基于nRF51822和nRF52832芯片的示例代码,以及设备固件升级(DFU)相关的代码。 ## 项目的主要特性和功能 基于nRF5系列芯片项目代码适用于Nordic Semiconductor的nRF51822和nRF52832芯片,这些芯片是专为蓝牙低能耗应用设计的。 使用SoftDevice SDK项目使用了Nordic的SoftDevice SDK,这是一个高度优化的BLE堆栈,适用于nRF5系列芯片。 支持UART通信项目中的BLE应用程序通过UART接口进行通信,允许数据通过BLE连接进行发送和接收。 设备固件升级(DFU)支持项目包含用于安全设备固件升级的引导加载程序,支持固件更新的验证和存储。

    矿业生产管理数字化平台解决方案.doc

    矿业生产管理数字化平台解决方案.doc

    【ACO三维路径规划】基于matlab蚁群算法ACO无人机巡检三维路径规划【含Matlab源码 13058期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    battery 电池信息表

    kylin v10 SP1 系统下 可以查看本机电池容量放电和充电电流

    基于深度学习的movielens推荐模型新版算法源码+数据+说明文档

    【资源介绍】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,也可以作为小白实战演练和初期项目立项演示的重要参考借鉴资料。 3、本资源作为“学习资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研和多多调试实践。 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip

    【雷达通信】基于matlab雷达系统极化对消仿真【含Matlab源码 9700期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    STM32的智能养老服务机器人系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    基于STM32的智能风扇系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    14.智能台灯(语音模式)_20240318_205506.zip

    14.智能台灯(语音模式)_20240318_205506.zip

    数字信号处理中的采样与重构理论及其应用

    数字信号处理中的采样与重构理论及其应用

    Python快速入门.zip

    python快速入门,零基础也能轻松掌握的入门指南,看着一个就够了。

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读取方法。 ,LabVIEW; 三菱全系列通讯方法; 三菱全系列通讯办法; 上位机读取方法,LabVIEW与三菱全系列通讯方案及上位机读取方法详解

    基于51的多参数水质监测与报警系统设计20250304

    题目:基于51单片机的多参数水质监测与报警系统设计 主控:AT89C51 显示:LCD1602 DS18B20温度传感器 浊度传感器(PCF8591+滑动变阻器模拟) PH传感器(ADC0832+滑动变阻器) 声光报警 led*4 功能: 1.实时检测水质温度、浊度、PH 2.实时显示相关数据 3.可以通过按键修改阈值 4.各数值不在标准范围内启动声光报警 5.ph低于下限红色小灯点亮;ph高于上限绿色小灯电亮;温度低于阈值蓝色小灯电亮;浑浊度高于阈值橙色小灯电亮

    B站黑马程序员python第二章06-标识符(个人笔记)

    在B站看黑马程序员视频,整理的个人笔记

    java项目之水果系统源码.zip

    java项目之水果系统源码

    Delphi 12.3 控件之Office-Tool-with-runtime-v10.14.28.0-x64.zip.rar

    Office_Tool_with_runtime_v10.14.28.0_x64.zip.rar

    【车间调度】基于matlab人工蜂群算法ABC求解分布式置换流水车间调度DPFSP【含Matlab源码 6166期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

Global site tag (gtag.js) - Google Analytics