最近同学推荐了一个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,这是一个问题。
希望大家有志研究共同提高。
光看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,这是一个问题。
希望大家有志研究共同提高。