有些时候我们想要抓取网上上的信息,然后对网页上信息进行提取,得到我们想要的数据,这时候我们可以用HtmlParser进行信息提取。下面介绍一下在项目中常用到的HtmlParser的一些用法:
1. ObjectFindVisitor用法
例子如下: 查询出TABLE节点
package com;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.tags.TableTag;
import org.htmlparser.visitors.ObjectFindingVisitor;
public class T{
public static void main(String[] args){
System.out.println(testObjectFindVisitor());
}
/*
* 测试ObjectFindVisitor的用法
*/
public static String testObjectFindVisitor() {
String result ="";
try {
//要解析的文件
Parser parser = new Parser ("test.html");
//设置编码集
parser.setEncoding("UTF-8");
//取得TableTag节点 (TableTag.class)
ObjectFindingVisitor visitorTable = new ObjectFindingVisitor(TableTag.class);
parser.visitAllNodesWith(visitorTable);
Node[] nodesTable = visitorTable.getTags();
for (int i = 0; i < nodesTable.length; i++) {
TableTag tableTag = (TableTag) nodesTable[i];
result = tableTag.toString();
}
/**
* 另外还有一些其它的节点类
* ImageTag :图片
* Div :div
* BodyTag :body部分
* FormTag :表单
* HeadTag : HEAD部分
* FrameTag 等等 *
*/
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
Test.html中的内容为;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test.html</title>
</head>
<body>
<table>
<tr>
<th>用户名</th>
<th>所属公司</th>
</tr>
<tr>
<td><a href="http://test1.com">test1</a></td>
<td>test1公司</td>
</tr>
<tr>
<td><a href="http://test2.com">test2</a></td>
<td>test2公司</td>
</tr>
</table>
</body>
</html>
打印结果为:
TableTag
********
<table>
<tr>
<th>用户名</th>
<th>所属公司</th>
</tr>
<tr>
<td><a href="http://test1.com">test1</a></td>
<td>test1公司</td>
</tr>
<tr>
<td><a href="http://test2.com">test2</a></td>
<td>test2公司</td>
</tr>
</table>
2. NodeClassFilter用法(和上面的输入结果一样)
/*
* 测试NodeClassFilter用法(过滤得到我们要的节点)
*/
public static void testNodeClassFilter() {
try {
//得到Table节点数据
NodeFilter filter = new NodeClassFilter(TableTag.class);
Parser parser = new Parser (test.html");
parser.setEncoding("UTF-8");
NodeList list = parser.extractAllNodesThatMatch(filter);
Node[] nodes = list.toNodeArray();
for (int i = 0; i < nodes.length; i++) {
TableTag table = (TableTag) nodes[i];
System.out.println(table.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
3 OrFilter的用法, 联合ObjectFindVisitor和NodeClassFilter使用
例如:查找出TABLE然后,提取里面的文本和链接,放入到User对象中
User.java
package com;
public class User {
//用户名
String name ="";
/**
* 详情(我们一般不这么放,这里只是一个例子,一般这个都是附件等的一些地址,这里就不做特殊处理)
*/
String href ="";
//公司
String company="";
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
处理类
/**
* OrFilter的用法
* 联合ObjectFindVisitor和NodeClassFilter使用
*
* @return
*/
public static List<User> getUserList(){
List<User> userlist = new ArrayList<User>();
try{
ObjectFindingVisitor visitor = new ObjectFindingVisitor(TableTag.class);
Parser parser = new Parser ("test.html");
parser.setEncoding("UTF-8");
parser.visitAllNodesWith(visitor);
Node[] nodes = visitor.getTags();
String content ="";
for (int i = 0; i < nodes.length; i++) {
TableTag tableTag = (TableTag) nodes[i];
if (tableTag.toString().indexOf("TableTag")>=0 ){
content = tableTag.toString();
content = content.trim();
content=content.substring(content.indexOf("<table>"),content.indexOf("</table>"));
break;
}
}
List list = new ArrayList();
//上半部分是用ObjectFindingVisitor,提取出TABLE
//---------------------------------------------
//下半部分是用OrFilter和NodeClassFilter提取出文本和链接内容
if (!content.equals("")){
NodeList nodeList = null;
Parser myParser = Parser.createParser(content, "UTF-8");
//文本内容
NodeFilter textFilter = new NodeClassFilter(TextNode.class);
//链接内容
NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);
OrFilter filter = new OrFilter();
filter.setPredicates(new NodeFilter[] { textFilter, linkFilter });
nodeList = myParser.parse(filter);
//取得所有的文本和链接节点
Node[] d_nodes = nodeList.toNodeArray();
for (int i = 0; i < d_nodes.length; i++){
//标记为文本内容
String d_biaoshi = "T:";
Node d_anode = (Node) d_nodes[i];
String d_line = "";
if (d_anode instanceof TextNode){
TextNode d_textnode = (TextNode) d_anode;
d_line = d_textnode.getText();
}else if (d_anode instanceof LinkTag){
LinkTag d_linknode = (LinkTag) d_anode;
d_line = d_linknode.getLink();
//标记为链接内容
d_biaoshi = "L:";
} if(d_line==null||"".equals(d_line.trim()))continue;
d_line=d_line.replaceAll("/n","").replaceAll("/t","").trim();
list.add(d_biaoshi+d_line);
}
for(int j = 0 ;j<list.size();j++){
String temp = (String)list.get(j);
//链接前面的说明是表头信息,从链接开始要提取的内容
if (temp.startsWith("L:")){
User user = new User();
user.setHref(temp.substring(2));
//链接的下一个是名字
j++;
temp = (String)list.get(j);
//设置名称
user.setName(temp.substring(2));
//名字的下一个是所属公司
j++;
temp = (String)list.get(j);
user.setCompany(temp.substring(2));
userlist.add(user);
}
} //------------------------------------------------------- //打印出所有的用户相关信息
for(int i = 0 ;i <userlist.size();i++){
User user = userlist.get(i);
System.out.println("======用户名======="+user.getName());
System.out.println("=======链接======"+user.getHref());
System.out.println("=======公司======"+user.getCompany());
System.out.println("-------------------------------");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return userlist;
}
打印结果为:
======用户名=======test1
=======链接======http://test1.com
=======公司======test1公司
--------------------------------------------------------
======用户名=======test2
=======链接======http://test2.com
=======公司======test2公司
以上是我在项目中用的HtmlParser的用法,另外还在网上找了一些其它的用法,大体思路都是类似的。有一些其它的例子可以参考:
http://j2ee.blog.sohu.com/37474805.html
http://gcgmh.javaeye.com/blog/474093