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(){@Overridepublic boolean accept(Node node){//這裡不需要if(node instanceof TagNode),因為上面已經定義了TagNode類型的泛型Tif(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); //提取真實tagtags.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;}}}