java htmlparser 简单使用入门

   下面对htmlparser 简单介绍下,信息来自百度吐舌头

htmlparser [1] 是一个纯的 java写的 html标准通用标记语言下的一个应用)解析的库,它不依赖于其它的java库文件,主要用于改造或
提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。
毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。
无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。
基本功能

1、信息提取
  • 文本 信息抽取,例如对HTML进行有效信息搜索;
  • 链接提取,用于自动给页面的链接文本加上链接的标签;
  • 资源提取,例如对一些 图片、声音的资源的处理;
  • 链接检查,用于检查HTML中的链接是否有效;
  • 页面内容的监控。
2、信息转换
  • 链接重写,用于修改 页面中的所有 超链接
  • 网页内容拷贝,用于将网页内容保存到本地;
  • 内容检验,可以用来过滤网页上一些令人不愉快的字词;
  • HTML信息清洗,把本来乱七八糟的HTML信息格式化;
  • 转成 XML格式数据。
找了点资料学习了下,将笔记记录下来 官网: http://htmlparser.codeplex.com/

下面使用一个小程序演示下,演示抓取美团上面的文字


发现这些文本都在ul上且ul的样式为filter-strip__list


可以通过Ul找到子元素

附上代码

package com.test;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
 * 获取网页内容
 * 
 * @author xuyw
 * @email xyw10000@163.com
 * @date 2013-06-04
 */
public class Test3 {

	public static void main(String[] args) {
		try {
			Parser parser = new Parser((HttpURLConnection) (new URL(
					"http://nc.meituan.com/")).openConnection());
			// TextExtractingVisitor visitor = new TextExtractingVisitor();
			// parser.visitAllNodesWith(visitor);
			// String textInPage = visitor.getExtractedText();
			// System.out.println(textInPage);
			//查找含有filter-strip__list样式的元素
			NodeFilter filter = new HasAttributeFilter("class",
					"filter-strip__list");
			NodeList nodes = parser.extractAllNodesThatMatch(filter);
			System.out.println("------抓取到" + nodes.size() + "条符合条件记录------");
			for (int i = 0; i < nodes.size(); i++) {
				Node node = nodes.elementAt(i);
				System.out.println();
				System.out.println(node.getText());
				NodeList cnode = node.getChildren();
				for (int j = 0; j < cnode.size(); j++) {
					Node tnode = cnode.elementAt(j);
					System.out.println(tnode.toPlainTextString());
				}
				System.out.println();
				System.out.println(node.getText());
			}
		} catch (ParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
运行结果

下面简单介绍其他方法


构造函数:
    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);

HTMLParser将解析过的信息保存为一个树的结构。
Node是信息保存的数据类型基础。
Node中包含的方法有几类:

Node getParent ()--取得父节点
NodeList getChildren ()--取得子节点的列表
Node getFirstChild ()--取得第一个子节点
Node getLastChild ()--取得最后一个子节点
Node getPreviousSibling ()--取得前一个兄弟
Node getNextSibling ()--取得下一个兄弟节点

取得Node内容的函数:

String getText ()--取得文本
String toPlainTextString()--取得纯文本信息。
String toHtml () --取得HTML信息
String toHtml (boolean verbatim):取得HTML信息
String toString ()--取得字符串信息
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有对应的操作)

Filter类
       对结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。

判断类Filter:

TagNameFilter --标签过滤
HasAttributeFilter --属性过滤
     有3个构造函数:
                  public HasAttributeFilter ();
                  public HasAttributeFilter (String 属性);
                  public HasAttributeFilter (String 属性, String 值);
                  


HasChildFilter --子元素过滤
HasParentFilter --父元过滤素
HasSiblingFilter --兄弟过滤
IsEqualFilter

逻辑运算Filter:

AndFilter
     可以把两种Filter进行组合
        NodeFilter filterID = new HasAttributeFilter( "id" );
        NodeFilter filterChild = new HasChildFilter(filterA);
        NodeFilter filter = new AndFilter(filterID, filterChild);
NotFilter【类似上面】
OrFilter【类似上面】
XorFilter
       NodeFilter filterID = new HasAttributeFilter( "id" );
       NodeFilter filterChild = new HasChildFilter(filterA);
       NodeFilter filter = new XorFilter(filterID, filterChild);

其他Filter:

NodeClassFilter
              NodeFilter filter = new NodeClassFilter(RemarkNode.class);
              NodeList nodes = parser.extractAllNodesThatMatch(filter);
StringFilter
             用于过滤显示字符串中包含制定内容的Tag。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示。
             NodeFilter filter = new StringFilter("www.baidu.com");
             NodeList nodes = parser.extractAllNodesThatMatch(filter); 
LinkStringFilter
               用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。
               NodeFilter filter = new LinkStringFilter("www.baidu.com");
               NodeList nodes = parser.extractAllNodesThatMatch(filter); 
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter

所有的Filter类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node);
各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回true,否则返回false。


  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值