HtmlParser的使用

HtmlParser的使用


在对抓取来的页面进行分析时,我们可以使用htmlParser工具:

以下將dmeo簡單的程式範例

Demo1

public static void main(String[] args) throws Exception

{
//不完整格式的HTML訊息
String html = "我們是害蟲<table>1234567890<table>lk你好中國";
Parser parser = Parser.createParser(new String(html.getBytes(),"8859_1"));
Node [] tables = parser.extractAllNodesThatAre (TableTag.class);
for (int i = 0; i < tables.length; i++) {
TableTag tableTag = (TableTag)tables[i];
//列印出結束標籤所在的未知
System.out.println("END POS:"+tableTag.getEndTag().getEndPosition());
//補齊未結束的標籤並列印
System.out.println(new String(tableTag.toHtml().getBytes("8859_1")));
}
}

Demo2

/**
* 獲取HTML的預覽訊息,其中content是對象的一個屬性,也就是待處理的HTML內容
* @return
*/

public String getPreviewContent(){

//截取前N個字符
String ct = StringUtils.left(content,MAX_COUNT);

//對一些未完成的標籤先補齊,避免出現例如<tab這樣的標籤
if(ct!=null content!=null) {
int idx2 = ct.lastIndexOf('>');
int idx1 = ct.lastIndexOf('<');
if((idx2==-1 idx1>=0) || idx1 > idx2) {
String ct2 = content.substring(ct.length());
int idx3 = ct2.indexOf('>');
if(idx3!=-1 idx3<(MAX_COUNT2-MAX_COUNT)) {
ct += content.substring(ct.length(),ct.length()+idx3+1);
}
}
}

//對於一些頁面嵌入了ActiveX對象進行預處理
if(ct!=null content!=null) {
int idx2 = ct.toLowerCase().lastIndexOf("</object>");
int idx1 = ct.toLowerCase().lastIndexOf("<object");
if((idx2==-1 idx1>=0) || idx1 > idx2) {
String ct2 = content.substring(ct.length()).toLowerCase();
int idx3 = ct2.indexOf("</object>");
if(idx3!=-1)
ct += content.substring(ct.length(),ct.length()+idx3+9);
else
ct = ct.substring(0,idx1);
}
}
if(ct!=null content!=null) {
Parser parser = Parser.createParser(new String(ct.getBytes(),ISO8859_1));

//中文訊息必須轉碼後方可傳入

Node [] tables = parser.extractAllNodesThatAre (TableTag.class);
if(tables!=null tables.lengtd>0) {
TableTag tableTag = (TableTag)tables[0];
ct = ct.substring(0,tableTag.getStartPosition())
+ new String(tableTag.toHtml().getBytes(ISO8859_1));

//處理後的數據轉回GBK的編碼
}
}
return ct;
}




運用HTMLParser API 提供三種方式之HTML Tag的擷取

* 方法一

// 使用 ObjectFindingVisitor 配合不同的 Tag.class 分析網頁
try {
ImageTag imgLink;
ObjectFindingVisitor visitor = new ObjectFindingVisitorImageTag.class);
Parser parser = new Parser();
parser.seturl(/url);
parser.setEncoding(parser.getEncoding());
parser.visitAllNodesWith(visitor);
Node[] nodes = visitor.getTags();
for (int i = 0; i < nodes.length; i++) {
// ImageTag
imgLink = (ImageTag) nodes[i];
// "http://www.msn.com.tw/webinclude/zh-tw/images/msn.gif" => ImageURL
System.out.println("ImageURL = " + imgLink.getImageURL());
// "/webinclude/zh-tw/images/msn.gif" => ImageLocation
System.out.println("ImageLocation = " + imgLink.extractImageLocn());
// SRC value
System.out.println("SRC = " + imgLink.getAttribute("SRC"));
}
} catch (Exception e) {
e.printStackTrace();
}

* 方法二

// 使用不同的 NodeFilter 分析網頁
try {
NodeFilter filter = new TagNameFilter("IMG");
NodeFilter filter1 = new NodeClassFilter(ImageTag.class);
Parser parser = new Parser();
parser.seturl(/url);
parser.setEncoding(parser.getEncoding());
NodeList list = parser.extractAllNodesThatMatch(filter);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.elementAt(i).toHtml());
}
} catch (Exception e) {
e.printStackTrace();
}

* 方法三

// 直接使用 Tag.class 分析網頁
try {
Parser parser = new Parser();
parser.seturl(/url);
parser.setEncoding(parser.getEncoding());
Node[] nodes = parser.extractAllNodesThatAre(ImageTag.class);
for (int i = 0; i < nodes.length; i++) {
ImageTag imageTag = (ImageTag) nodes[i];
System.out.println(imageTag.getImageURL());
}
} catch (Exception e) {
e.printStackTrace();
}

阅读更多
文章标签: HTML
个人分类: technology
上一篇误区 stock
下一篇 08年江西0分作文
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭