网页采集程序:
如果是整个网页保存到本地/读取的话,直接用outputStrem和inputStream读取
HTMLParser用来做网页的分析和内容提取特别方法
HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。
使用HTMLParser需要下载相关的jar包,导入到项目中
例子:
private static Map<String, String> getSubMenuMap(String webUrl) {
final Map<String, String> menuMap = new HashMap<String, String>();
try {
// 输出调试信息, 并将之添加到报告文件中
System.out.println("Getting menuTable by url: " + webUrl);
// 初始化URL和HttpURLConnction的对象
boolean isAccess = true; // URL是否可访问, 默认可以访问
URL url = new URL(webUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(false); // 设定不要自动跳转
conn.setReadTimeout(20000); // 设定timeout时间
conn.connect(); // 连线
int status = conn.getResponseCode(); // 获取HTTP状态码
String staStr = ""; // HTTP状态描述
switch (status) {
// 服务器返回200, 访问正常
case HttpURLConnection.HTTP_OK:
isAccess = true;
staStr = "Normal!";
break;
// 服务器返回403, 当前禁止访问该URL
case HttpURLConnection.HTTP_FORBIDDEN:
isAccess = false;
staStr = "Access is forbidden!";
break;
// 服务器返回404, URL指定页面未找到
case HttpURLConnection.HTTP_NOT_FOUND:
isAccess = false;
staStr = "Page not found!";
break;
// 服务器返回503, 服务暂不可用
case HttpURLConnection.HTTP_UNAVAILABLE:
isAccess = false;
staStr = "Service is unavailable!";
break;
}
if (isAccess == true) {
//从urlconnect中读取hrml节点
Parser parser = new Parser(conn);
//建立节点过滤器(有很多个具体自己查)
HasAttributeFilter pAttributeFilter = new HasAttributeFilter(
"class",
"main-cate-link gray J_CateLink J_MainCateLink");
//过滤后的节点list
NodeList nodeList = parser.extractAllNodesThatMatch(pAttributeFilter);
for (int i = 0; i < nodeList.size(); i++) {
//从节点list中获取单个节点(有好几种类型)
LinkTag linkTag = (LinkTag) nodeList.elementAt(i);
System.out.println("------" + linkTag.getAttribute("href"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return menuMap;
}
HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
和一个静态类public static Parser createParser (String html, String charset);
(一)Filter类
顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。
判断类Filter:
TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
逻辑运算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
Node中包含的方法有几类:
对于树型结构进行遍历的函数,这些函数最容易理解:
Node getParent ():取得父节点
NodeList getChildren ():取得子节点的列表
Node getFirstChild ():取得第一个子节点
Node getLastChild ():取得最后一个子节点
Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node getNextSibling ():取得下一个兄弟节点
取得Node内容的函数:
String getText ():取得文本
String toPlainTextString():取得纯文本信息。
String toHtml () :取得HTML信息(原始HTML)
String toHtml (boolean verbatim):取得HTML信息(原始HTML)
String toString ():取得字符串信息(原始HTML)
Page getPage ():取得这个Node对应的Page对象
int getStartPosition ():取得这个Node在HTML页面中的起始位置
int getEndPosition ():取得这个Node在HTML页面中的结束位置
用于Filter过滤的函数:
void collectInto (NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。
用于Visitor遍历的函数:
void accept (NodeVisitor visitor):对这个Node应用visitor
用于修改内容的函数,这类用得比较少:
void setPage (Page page):设置这个Node对应的Page对象
void setText (String text):设置文本
void setChildren (NodeList children):设置子节点列表
其他函数:
void doSemanticAction ():执行这个Node对应的操作(只有少数Tag有对应的操作)
Object clone ():接口Clone的抽象函数。
更多的详情 参考:http://www.cnblogs.com/loveyakamoz/archive/2011/07/27/2118937.html