htmlparser示例

import java.io.BufferedReader;  
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.TextExtractingVisitor;

/**
* 演示了Html Parse的應用.
*
*/
public class ParseHtmlTest {

public static void main(String[] args) throws Exception {
String aFile = "F:\\百度一下,你就知道.htm";

String content = readTextFile(aFile, "GBK");

test1(content);
System.out.println("====================================");

test2(content);
System.out.println("====================================");

test3(content);
System.out.println("====================================");

test4(content);
System.out.println("====================================");

test5(aFile);
System.out.println("====================================");

//訪問外部資源,相對慢
test5("http://www.baidu.com");
System.out.println("====================================");

}

/**
* 讀取文件的方式來分析內容.
* filePath也可以是一個Url.
*
* @param resource 文件/Url
*/
public static void test5(String resource) throws Exception {
Parser myParser = new Parser(resource);

//設置編碼
myParser.setEncoding("GBK");

HtmlPage visitor = new HtmlPage(myParser);

myParser.visitAllNodesWith(visitor);

String textInPage = visitor.getTitle();

System.out.println("test5 html title = " + textInPage);
}

/**
* 按頁面方式處理.對一個標準的Html頁面,推薦使用此種方式.
*/
public static void test4(String content) throws Exception {
Parser myParser;
myParser = Parser.createParser(content, "GBK");

HtmlPage visitor = new HtmlPage(myParser);

myParser.visitAllNodesWith(visitor);

String textInPage = visitor.getTitle();

System.out.println("test4 html title = " + textInPage);
}

/**
* 利用Visitor模式解析html頁面.
*
* 小優點:翻譯了<>等符號
* 缺點:好多空格,無法提取link
*
*/
public static void test3(String content) throws Exception {
Parser myParser;
myParser = Parser.createParser(content, "GBK");

TextExtractingVisitor visitor = new TextExtractingVisitor();

myParser.visitAllNodesWith(visitor);

String textInPage = visitor.getExtractedText();

System.out.println("test3 = " + textInPage);
}

/**
* 得到普通文本和鏈接的內容.
*
* 使用了過濾條件.
*/
public static void test2(String content) throws ParserException {
Parser myParser;
NodeList nodeList = null;

myParser = Parser.createParser(content, "GBK");

NodeFilter textFilter = new NodeClassFilter(TextNode.class);
NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

//暫時不處理 meta
//NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);

OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

nodeList = myParser.parse(lastFilter);

Node[] nodes = nodeList.toNodeArray();

for (int i = 0; i < nodes.length; i++) {
Node anode = (Node) nodes[i];

String line = "";
if (anode instanceof TextNode) {
TextNode textnode = (TextNode) anode;
//line = textnode.toPlainTextString().trim();
line = textnode.getText();
} else if (anode instanceof LinkTag) {
LinkTag linknode = (LinkTag) anode;

line = linknode.getLink();
//@todo 過濾jsp標籤:可以自己實現這個函數
//line = StringFunc.replace(line, "<%.*%>", "");
}

if (isTrimEmpty(line))
continue;

System.out.println("test2 = " + line);
}
}

/**
* 解析普通文本節點.
*
* @param content
* @throws ParserException
*/
public static void test1(String content) throws ParserException {
Parser myParser;
Node[] nodes = null;

myParser = Parser.createParser(content, null);
NodeFilter nodeFilter = new TagNameFilter(TextNode.class.getName());
nodes = myParser.extractAllNodesThatMatch(nodeFilter).toNodeArray(); //exception could be thrown here

for (int i = 0; i < nodes.length; i++) {
TextNode textnode = (TextNode) nodes[i];
String line = textnode.toPlainTextString().trim();
if (line.equals(""))
continue;
System.out.println("test1 = " + line);
}

}

/**
* 讀取一個文件到字符串裏.
*
* @param sFileName 文件名
* @param sEncode String
* @return 文件內容
*/
public static String readTextFile(String sFileName, String sEncode) {
StringBuffer sbStr = new StringBuffer();

try {
File ff = new File(sFileName);
InputStreamReader read = new InputStreamReader(new FileInputStream(ff), sEncode);
BufferedReader ins = new BufferedReader(read);

String dataLine = "";
while (null != (dataLine = ins.readLine())) {
sbStr.append(dataLine);
sbStr.append("\r\n");
}

ins.close();
} catch (Exception e) {
System.out.println("read Text File Error");
e.printStackTrace();
}

return sbStr.toString();
}

/**
* 去掉左右空格後字符串是否爲空
* @param astr String
* @return boolean
*/
public static boolean isTrimEmpty(String astr) {
if ((null == astr) || (astr.length() == 0)) {
return true;
}
if (isBlank(astr.trim())) {
return true;
}
return false;
}

/**
* 字符串是否爲空:null或者長度爲0.
* @param astr 源字符串.
* @return boolean
*/
public static boolean isBlank(String astr) {
if ((null == astr) || (astr.length() == 0)) {
return true;
} else {
return false;
}
}

}
發佈了71 篇原創文章 · 獲贊 2 · 訪問量 3666
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章