`
yuanyu5237
  • 浏览: 159913 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用htmlParser分析网页

阅读更多

关于这个工具的简介就不说了,这里只介绍其用法。

(一),来看它的API:

Packages
org.htmlparser                         
org.htmlparser.beans
org.htmlparser.filters
org.htmlparser.http
org.htmlparser.lexer
org.htmlparser.lexerapplications.thumbelina
org.htmlparser.nodes
org.htmlparser.parserapplications
org.htmlparser.parserapplications.filterbuilder
org.htmlparser.parserapplications.filterbuilder.layouts
org.htmlparser.parserapplications.filterbuilder.wrappers
org.htmlparser.sax
org.htmlparser.scanners
org.htmlparser.tags
org.htmlparser.util
org.htmlparser.util.sort
org.htmlparser.visitors

点击上面的链接,每一个类都有详细的方法和字段释义。在此,我们常用到的几个类是:Parser; Filter; Util; Node; Tags;

(二),使用htmlparser的最一般方法,可以分为下面几个步骤:

1)

和目标网页(目标网页可以是网络上的一个URL,也可以是一个本地的网页文件)建立连接;

2)

定义解析器(Parser),解析器可以设定要解析的目标页,可以设定解析页面时的编码;

3)

构造过滤器,htmlParser给我们提供的过滤器类型有很多,大致分为简单过滤器(TagNameFilter)和复合型过滤器(AndFilter),简单过滤器即过滤某个标签的名称或属性,复合过滤器可以包含多个简单过滤器,并对它进行逻辑运算;

4)

使用定义好的解析器和过滤器解析页面,此时返回给我们的是一个包含所有符合条件的Node数组;

5)

循环该数组,并对数组中的每一个节点进行解析(一般都是将这些节点转化为某一个具体的html标签),取得需要的节点属性。

(三),按照上面的步骤,可以做一个最简单的htmlParser解析的实例(假设我们解析百度首页中的超链接信息):

例程1 写道
package com.crawler;

import java.net.URL;
import java.net.URLConnection;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;

public class HtmlParserTest1 {

public static void main(String[] args) throws Exception {
URL url = new URL("http://www.baidu.com");
URLConnection urlConn = url.openConnection();
Parser parser = new Parser(urlConn);
NodeFilter nodeFilter = new AndFilter(new TagNameFilter("a"),
new HasAttributeFilter("href"));
NodeList nodeList = parser.parse(nodeFilter);
NodeIterator it = nodeList.elements();
while (it.hasMoreNodes()) {
Node node = it.nextNode();
System.out.println(((LinkTag) node).getAttribute("href"));
}
}
}

 (四)如果只是实现常见的功能,了解了上面方法和步骤,然后查看其API,自然都可以做到了,但如果我们要做一些更高级的功能,就必须对这个工具进行扩展,由于htmlParser定义良好的接口,我们可以方便的写出自己想要的网页解析工具,在这里我举一个例子,假如我们要对WML(无线标记语言,常用于移动设备的web开发)进行解析,这里就涉及到一些新的标签,比如go,anchor,postfield等,同样,我给出一个简单的示例:

首先,这是我们的wml网页内容:test.wml 写道
<a href="http://www.iteye.com?cat_id=1">Javaeye</a>
或者:
<anchor>
Java自由人
<go href="http://www.iteye.com" method="get">
<postfield name="cat_id" value="1"/>
</go>
</anchor>

 

具体的解析代码,HyperLinkTrace.java 写道
package com.htmlParser;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.PrototypicalNodeFactory;
import org.htmlparser.tags.CompositeTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;

public class HyperLinkTrace {
public static void main(String[] args) throws Exception {
// 初始化HTMLParser
Parser parser = new Parser();
parser.setEncoding("8859_1");
parser.setInputHTML(getWmlContent());
// 注册新的结点解析器
PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
factory.registerTag(new WmlGoTag());
parser.setNodeFactory(factory);
// 遍历符合条件的所有节点
NodeList nlist = parser.extractAllNodesThatMatch(lnkFilter);
for (int i = 0; i < nlist.size(); i++) {
CompositeTag node = (CompositeTag) nlist.elementAt(i);
if (node instanceof LinkTag) {
LinkTag link = (LinkTag) node;
System.out.println("LINK: \t" + link.getLink());
} else if (node instanceof WmlGoTag) {
WmlGoTag go = (WmlGoTag) node;
System.out.println("GO: \t" + go.getLink());
}
}
}

/**
* 获取测试的WML脚本内容
*
* @return
* @throws Exception
*/
static String getWmlContent() throws Exception {
File f = new File("test.wml");
BufferedReader in = new BufferedReader(new FileReader(f));
StringBuffer wml = new StringBuffer();
do {
String line = in.readLine();
if (line == null)
break;
if (wml.length() > 0)
wml.append("\r\n");
wml.append(line);
} while (true);
return wml.toString();
}

/**
* 解析出所有的链接,包括行为<a>与<go>
*/
static NodeFilter lnkFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node instanceof WmlGoTag)
return true;
if (node instanceof LinkTag)
return true;
return false;
}
};

/**
* WML文档的GO标签解析器
*
* @author Winter Lau
*/
static class WmlGoTag extends CompositeTag {
private static final String[] mIds = new String[] { "GO" };
private static final String[] mEndTagEnders = new String[] { "ANCHOR" };

public String[] getIds() {
return (mIds);
}

public String[] getEnders() {
return (mIds);
}

public String[] getEndTagEnders() {
return (mEndTagEnders);
}

public String getLink() {
return super.getAttribute("href");
}

public String getMethod() {
return super.getAttribute("method");
}
}

}

 以上这个示例的来源是:http://www.ibm.com/developerworks/cn/opensource/os-htmlparser/

读完上面的文章应该对此用法有更深入的认识。

接下来,我还会写几篇文章对htmlParser的一些用法上细节做一介绍。

分享到:
评论

相关推荐

    htmlparser网页分析

    关于用java写的htmlparser网页分析

    htmlparser

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的... 毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。  无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    HtmlParser

    htmlparser[1]是一个纯的java写的html(标准通用标记语言下的一个应用...毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    论文研究-基于HttpClient与HTMLParser的网页正文提取 .pdf

    基于HttpClient与HTMLParser的网页正文提取,陈智彬,崔鸿雁,随着互联网的高速发展,针对互联网的分析处理显得日益重要。本文研究了HttpClient、HTMLParser等技术,提出并实现了一种基于HttpClient与HTM

    HTMLParser

    HTMLParser2.0。最新的用于分析网页内容的java开源工具包。

    htmlparser1_6

    htmlparser1_6 网页匹配 抓取网页 分析数据

    HtmlParser源码及其jar包

    基于java的分析网页源码结构的优秀开源软件。 快速分析网页,主要有三种操作形式

    htmlparser.jar

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库... 毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    htmlparser2.0

    包括需要使用的htmlparser的所有package,它和httpclient.jar联合用于网页分析、过滤等效果更好。

    Winista.HTMLParser.dll

    解析网页利器 而且是开源资源 大小192kb HTML杀手 分析器类库 完整的规范化类

    htmlparser.jar.zip

    实现简易爬虫、网页分析等所用到的几个包htmlparser.jar

    HTMLParser 1.6

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的... 毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。  无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    Java使用HttpClient和HtmlParser实现的爬虫Demo.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    HTML网页信息拆分\页链接资源分析组件

    1:HtmlSplit.pas 这个是HTML网页信息拆分组件 2:TopBuffer.pas 重复信息片动态分析组件 3:HtmlParser.pas 网页链接资源分析组件 4:CoreString.pas 左右字符串操作性能的基础算法

    jsoup网页内容分析

    可以用与html页面内容分析,提取所需内容,由于htmlParser好久没更新,可以考虑用这个试试

    Commons-httpClient3.1.Jar,htmllexer.jar,htmlparser.jar

    实现简易爬虫、网页分析等所用到的几个包 Commons-httpClient3.1.Jar,htmllexer.jar,htmlparser.jar

    用python写的多线程网页爬虫

    用python写了一个下载http://desk.zol.com.cn上面壁纸的爬虫,其中使用了HTMLParser模块方法分析页面,解析出每一页的入口地址,再根据入口地址分析内页的图片地址,解析内页地址使用了多线程,下载图片也是用的多...

Global site tag (gtag.js) - Google Analytics