一种新的东西HTMLParser

来源:互联网 发布:wifi网络延迟测试 编辑:程序博客网 时间:2024/06/08 01:31
最近同学推荐了一个THMLParser,用来解析html文件,可以在SourceForge上边找到。
光看doc有的东西是不容易搞懂的,需要在网上搜索一点例子。
一下是我在研究一下之后写出的一个简单例子:
package html.test;

import org.htmlparser.beans.HTMLLinkBean;
import java.net.URL;
import java.net.URLConnection;
import java.io.*;

public class TestLinks
{
    public static void main(String[] args) throws Exception
    {
        if (args.length<1 || !args[0].startsWith("http://"))
        {
            System.out.println("Useage: java TestPrint http://domain.com");
            System.exit(0);
        }
        URL url = new URL(args[0]);
        URLConnection uc = url.openConnection();
        //uc.connect();
        HTMLLinkBean hlb = new HTMLLinkBean();
        System.out.println("以下是页面的base-http链接:");
        hlb.setConnection(uc);
        System.out.println(hlb.getURL());
        URL [] u = hlb.getLinks();
        System.out.println("以下是页面中的http链接:");
        for (int i = 0; i<u.length ;i++ )
        {
            System.out.println(u[i].toString());
        }
    }
}

只是使用其中的一个组件HTMLLinkBean获取所有的超链接,保存为一个URL数组。而以下是一个在网上找到的LinkExtractor,不过以前的东西里边有两个函数在v1.6和v2.0里都找不到,我修改了一下,现在能用了。
package html.test;
import java.net.*;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.tags.FormTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.ParserException;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.beans.HTMLLinkBean;
import java.util.*;
/**
 * LinkExtractor extracts all the links from the given webpage
 * and prints them on standard output.
 */
public class LinkExtractor
{
    private String location;
    private Parser parser;
    public LinkExtractor(String location)
    {
        this.location = location;
        try
        {
            this.parser = new Parser(location); // Create the parser object
            parser.setEncoding("GB2312"); //加上这行使得可以访问中文网页
            //parser.setResource();        //改动处,去掉
            // Register standard scanners (Very Important)
        }
        catch (ParserException e)
        {
            e.printStackTrace();
        }

    }
    public void extractLinks() throws ParserException
    {
        HTMLLinkBean hlb = new HTMLLinkBean();
        hlb.setURL(location);
        URL [] urls = hlb.getLinks();
        System.out.println(urls.length);
        for (int i=0 ;i<urls.length ;i++ )
        {
            System.out.println(urls[i].toString());
        }
        System.out.println("Parsing " + location + " for links...");
        NodeList forms = parser.extractAllNodesThatMatch(new TagNameFilter("form"));
        for (int i = 0; i < forms.size(); i++)
        {
            FormTag formTag = (FormTag) forms.elementAt(i);
            System.out.println(formTag.getFormMethod());
            ArrayList list = new ArrayList();
            list.add(formTag);
            formTag = (FormTag) forms.elementAt(i);
            System.out.println(list.contains(formTag));
        }
       
    }
/*    //原方法,这里extractAllNodesThatAre方法不存在,会报错
    public void extractLinks() throws ParserException
    {
        System.out.println("Parsing " + location + " for links...");
        Node[] links = parser.extractAllNodesThatAre(LinkTag.class);
        for (int i = 0; i < links.length; i++)
        {
            LinkTag linkTag = (LinkTag) links[i];
            // Print it
            //            System.out.println(linkTag.toString());
            System.out.println(linkTag.getLink());
            // To extract only mail addresses, uncomment the following line
            //            if (linkTag.isMailLink()) System.out.println(linkTag.getLink());
        }
    }
*/

    public static void main(String[] args)
    {
        if (args.length < 1)
        {
            System.err.println(
                "Syntax Error : Please provide the location(URL or file) to parse");
            System.exit(-1);
        }
        LinkExtractor LinkExtractor = new LinkExtractor(args[0]);
        try
        {
            LinkExtractor.extractLinks();
        }
        catch (ParserException e)
        {
            e.printStackTrace();
        }
    }
}
有一点要注意,使用Filter得到了诸如form的Tag之后,就没法得到其他的Tag了如LinkTag,这是一个问题。
希望大家有志研究共同提高。