HTMLParser工具类v1.0

完整版见https://jadyer.github.io/




package com.jadyer.httpclient;

import java.util.ArrayList;
import java.util.List;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

/**
 * HTMLParser工具类
 * @see 所有jar如下
 * @see filterbuilder.jar(以下5个jar取自HTMLParser官网下载的HTMLParser-2.0-SNAPSHOT-bin.zip)
 * @see htmllexer.jar
 * @see htmlparser.jar
 * @see sitecapturer.jar
 * @see thumbelina.jar
 * @version v1.0
 * @history v1.0-->新建<code>parseTags()</code>和<code>parseTag()</code>方法
 * @create Mar 10, 2013 12:38:12 PM
 * @author 玄玉<http://blog.csdn/net/jadyer>
 */
public class HTMLParseUtil {
	/**
	 * 解析具有某类属性值的标签列表
	 * @see 定义泛型--><code><T extends TagNode></code>
	 * @see 使用泛型--><code>List<T>,Class<T></code>
	 * @see 这里定义了一个类型必须是某种TagNode的泛型T,并且返回的List也必须是泛型T
	 * @see 而Class<T>的意思是传给tagType的是什么类型,所以返回给List<T>的就是什么类型
	 * @see 比如传进来的是org.htmlparser.tags.MetaTag.class,那么返回的就是List<MetaTag>
	 * @param inputHTML      被解析的HTML文本
	 * @param tagType        标签的类型,内部类使用故final
	 * @param attributeName  待解析的属性名,内部类使用故final
	 * @param attributeValue 待解析的属性值,内部类使用故final
	 */
	@SuppressWarnings({ "unchecked", "serial" })
	public static <T extends TagNode> List<T> parseTags(String inputHTML, final Class<T> tagType, final String attributeName, final String attributeValue){
		//创建一个HTML解析器
		Parser parser = new Parser();
		NodeList tagList = null;
		try {
			parser.setInputHTML(inputHTML);
			//它会自动检测文件内部<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
			//parser.setEncoding("UTF-8");
			tagList = parser.parse(
				new NodeFilter(){
					@Override
					public boolean accept(Node node){
						//这里不需要if(node instanceof TagNode),因为上面已经定义了TagNode类型的泛型T
						if(node.getClass()==tagType){
							//Node类型的实现类中只有TagNode才能getAttribute()获取属性值,所以要将之打回原形
							T t = (T)node;
							//若传入的属性名是null,则认为是不需要查找指定属性值的标签,而是单纯的查找某类型T的标签
							//if(null == attributeName){
							//	return true;
							//}
							if(null!=attributeValue && attributeValue.equals(t.getAttribute(attributeName))){
								return true;
							}
						}
						return false;
					}
				}
			);
		} catch (ParserException e) {
			System.out.println("解析HTML文本时发生异常:" + e.getMessage());
		}
		List<T> tags = new ArrayList<T>();
		for(int i=0; i<tagList.size(); i++){
			T t = (T)tagList.elementAt(i); //提取真实tag
			tags.add(t);
		}
		return tags;
	}
	
	
	/**
	 * 解析属性值唯一的标签
	 * @see 和上面那个方法差不多,传给Class<T>的是什么类型,那么返回的就是什么类型
	 */
	public static <T extends TagNode> T parseTag(String inputHTML, final Class<T> tagType, final String attributeName, final String attributeValue){
		List<T> tagList = parseTags(inputHTML, tagType, attributeName, attributeValue);
		if(null!=tagList && tagList.size()>0){
			return tagList.get(0);
		}else{
			return null;
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML解析实用库,非常好用 public class HtmlLinkParser { //获取子链接,url为网页url,filter是链接过滤器,返回该页面子链接的HashSet public static Set<String> extracLinks(String url, LinkFilter filter) { Set<String> links = new HashSet<String>(); try { Parser parser = new Parser(url); parser.setEncoding("utf-8"); // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接 NodeFilter frameFilter = new NodeFilter() { public boolean accept(Node node) { if (node.getText().startsWith("frame src=")) { return true; } else { return false; } } }; // OrFilter 接受<a>标签或<frame>标签,注意NodeClassFilter()可用来过滤一类标签,linkTag对应<标签> OrFilter linkFilter = new OrFilter(new NodeClassFilter( LinkTag.class), frameFilter); // 得到所有经过过滤的标签,结果为NodeList NodeList list = parser.extractAllNodesThatMatch(linkFilter); for (int i = 0; i < list.size(); i++) { Node tag = list.elementAt(i); if (tag instanceof LinkTag)// <a> 标签 { LinkTag link = (LinkTag) tag; String linkUrl = link.getLink();// 调用getLink()方法得到<a>标签中的链接 if (filter.accept(linkUrl))//将符合filter过滤条件的链接加入链接表 links.add(linkUrl); } else{// <frame> 标签 // 提取 frame 里 src 属性的链接如 <frame src="test.html"/> String frame = tag.getText(); int start = frame.indexOf("src="); frame = frame.substring(start); int end = frame.indexOf(" "); if (end == -1) end = frame.indexOf(">"); String frameUrl = frame.substring(5, end - 1); if (filter.accept(frameUrl)) links.add(frameUrl); } } } catch (ParserException e) {//捕捉parser的异常 e.printStackTrace(); } return links; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值