posts - 297,  comments - 1618,  trackbacks - 0
       出处:http://blog.csdn.net/redez/archive/2005/11/21/534277.aspx
       说明:本文参考HTMLParser使用,并在该文的基础上进行了部分修改。
一. 简介
       htmlparser用于 对html页面进行解析,它是一个功能比较强大的工具。
       项目首页http://htmlparser.sourceforge.net/
       下载地址http://sourceforge.net/project/showfiles.php?group_id=24399
二. 使用举例
       下面通过一个简单的htmlparser的使用举例,来学习htmlparser的使用。代码如下:
package com.amigo.htmlparser;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

import org.htmlparser.filters.*;
import org.htmlparser.*;
import org.htmlparser.nodes.*;
import org.htmlparser.tags.*;
import org.htmlparser.util.*;
import org.htmlparser.visitors.*;

/**
 * 测试HTMLParser的使用.
 * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * Creation date: 2008-1-18 - 上午11:44:22
 
*/

public class HTMLParserTest {
    
/**
     * 入口方法.
     * 
@param args
     * 
@throws Exception
     
*/

    
public static void main(String args[]) throws Exception {
        String path 
= "http://www.blogjava.net/amigoxie";
        URL url 
= new URL(path);
        URLConnection conn 
= url.openConnection();
        conn.setDoOutput(
true); 
        
        InputStream inputStream 
= conn.getInputStream();
        InputStreamReader isr 
= new InputStreamReader(inputStream, "utf8");
        StringBuffer sb 
= new StringBuffer();
        BufferedReader in 
= new BufferedReader(isr);
        String inputLine;
        
        
while ((inputLine = in.readLine()) != null{
            sb.append(inputLine);
            sb.append(
"\n");
        }

        
        String result 
= sb.toString();

        readByHtml(result);
        readTextAndLinkAndTitle(result);
    }

    
    
/**
     * 按页面方式处理.解析标准的html页面
     * 
@param content 网页的内容
     * 
@throws Exception
     
*/

    
public static void readByHtml(String content) throws Exception {
        Parser myParser;
        myParser 
= Parser.createParser(content, "utf8");
        HtmlPage visitor 
= new HtmlPage(myParser);
        myParser.visitAllNodesWith(visitor);

        String textInPage 
= visitor.getTitle();
        System.out.println(textInPage);
        NodeList nodelist;
        nodelist 
= visitor.getBody();
        
        System.out.print(nodelist.asString().trim());
    }


    
/**
     * 分别读纯文本和链接.
     * 
@param result 网页的内容
     * 
@throws Exception
     
*/

    
public static void readTextAndLinkAndTitle(String result) throws Exception {
        Parser parser;
        NodeList nodelist;
        parser 
= Parser.createParser(result, "utf8");
        NodeFilter textFilter 
= new NodeClassFilter(TextNode.class);
        NodeFilter linkFilter 
= new NodeClassFilter(LinkTag.class);
        NodeFilter titleFilter 
= new NodeClassFilter(TitleTag.class);
        OrFilter lastFilter 
= new OrFilter();
        lastFilter.setPredicates(
new NodeFilter[] { textFilter, linkFilter, titleFilter });
        nodelist 
= parser.parse(lastFilter);
        Node[] nodes 
= nodelist.toNodeArray();
        String line 
= "";
        
        
for (int i = 0; i < nodes.length; i++{
            Node node 
= nodes[i];
            
if (node instanceof TextNode) {
                TextNode textnode 
= (TextNode) node;
                line 
= textnode.getText();
            }
 else if (node instanceof LinkTag) {
                LinkTag link 
= (LinkTag) node;
                line 
= link.getLink();
            }
 else if (node instanceof TitleTag) {
                TitleTag titlenode 
= (TitleTag) node;
                line 
= titlenode.getTitle();
            }

            
            
if (isTrimEmpty(line))
                
continue;
            System.out.println(line);
        }

    }

    
    
/**
     * 去掉左右空格后字符串是否为空
     
*/

    
public static boolean isTrimEmpty(String astr) {
        
if ((null == astr) || (astr.length() == 0)) {
            
return true;
        }

        
if (isBlank(astr.trim())) {
            
return true;
        }

        
return false;
    }


    
/**
     * 字符串是否为空:null或者长度为0.
     
*/

    
public static boolean isBlank(String astr) {
        
if ((null == astr) || (astr.length() == 0)) {
            
return true;
        }
 else {
            
return false;
        }

    }

}


posted on 2008-01-18 14:18 阿蜜果 阅读(14582) 评论(2)  编辑  收藏 所属分类: Java


FeedBack:
# re: HTMLParser的使用
2008-04-17 18:20 | zzz
请问一下,怎样将修改过得html保存到文件中
code如下
parser = new Parser(getContentByLocalFile(file));
NodeFilter nt = new NodeClassFilter(ImageTag.class) ;
NodeList tmpImageList = (NodeList) parser.parse(nt);

/*linkTmpHash = new Hashtable();
for (int i = 0; i < length; i++) {
Element tmpElement = (Element) tmpNodeList.item(i);
String href = tmpElement.getAttribute("href");
if (href != null && !href.equals("")) {
linkTmpHash.put(href, "");
}
}
data.setHrefs((String[]) linkTmpHash.keySet().toArray(new String[linkTmpHash.size()]));*/
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter (new FileOutputStream (file)));
linkTmpHash = new Hashtable();
for (int i = 0; i < tmpImageList.size(); i++) {
imgnode = (ImageTag)tmpImageList.elementAt(i);
String src = imgnode.getImageURL();
if (URLPathNameUtil.isAbsolutePath(src)) {
if (testAbsolutePath) {
testImagetag(file,src);
}
} else {
if (testRelativePath) {
testImagetag(file, src);
}
}
if(getRealPath()!=null){
imgnode.setImageURL(getRealPath());
writer.write(tmpImageList.toHtml());
}
/*if (src != null && !src.equals("")) {
linkTmpHash.put(src, "");
}*/
}
writer.flush();
writer.close ();

谢谢了  回复  更多评论
  
# re: HTMLParser的使用
2009-03-02 13:20 | 黄金矿工
感觉效率有点低下,另外处理字符编码的地方有点问题,取正文的时候js代码去不干净  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2286608
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜