HtmlParser技术:网页抓取

网页采集程序:

如果是整个网页保存到本地/读取的话,直接用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值