学习提取网页中的链接



package com.se.spider;

import java.net.URL;
import java.util.*;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;

import com.se.util.LinkFilter;


/***
 * 抽取网页中的链接 
 * ***/
public class HtmlLinkParser {
	
	/**
	 * 从指定的url中解析出所有存在的连接,并将其存放在一个ArrayList集合中
	 * @param url
	 * @param filter
	 * @return ArrayList<URL>
	 */
    public static ArrayList<URL> extracLinks(String url, LinkFilter filter) 
    {
        ArrayList<URL> links = new ArrayList<URL>();
        try 
        {   
            //创建一个解析器对象,传入url地址
            Parser parser = new Parser(url);
            //设定编码方式
            parser.setEncoding("gb2312");
            
            //过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
            NodeFilter frameFilter = new NodeFilter() 
            {   
            	/**
				 * 
				 */
				private static final long serialVersionUID = 1L;

				//设定匹配的法则,该节点是否以"frame src="开头
                public boolean accept(Node node) 
                {
                    if (node.getText().startsWith("frame src=")) 
                    {
                        return true;
                    }
                    else 
                    {
                        return false;
                    }
                }
            };
           //OrFilter 来设置过滤 <a> 标签和 <frame> 标签,两个标签是 or 的关系
            OrFilter linkFilter = new OrFilter( new NodeClassFilter(LinkTag.class),
            		                            frameFilter );
            // 得到所有经过过滤的标签
            NodeList list = parser.extractAllNodesThatMatch(linkFilter);
            for (int i = 0; i < list.size(); i++) 
            {
                Node tag = list.elementAt(i);
                if (tag instanceof LinkTag)   //即<a>标签
                {
                    LinkTag link = (LinkTag) tag;
                    String linkUrl = link.getLink();  //url
                    //System.out.println(linkUrl);    //测试用
                    
                    //将符合过滤条件的链接添加到ArrayList集合中,供后面的解析使用
                    if (filter.accept(linkUrl)) 
                    {
                        links.add(new URL(linkUrl));
                    }
                } 
                else    // <frame>标签
                {
                	//提取 frame 里 src 属性的链接如 <frame src="xxx.html"/>
                    String frame = tag.getText();
                    int start = frame.indexOf("src=");
                    frame = frame.substring(start);
                    int end = frame.indexOf(" ");
                    if (end == -1) 
                    {
                        end = frame.indexOf(">");
                    }
                    String frameUrl = frame.substring(5, end - 1);
                    
                    //将符合过滤条件的链接添加到ArrayList集合中,供后面的解析使用
                    if (filter.accept(frameUrl)) 
                    {
                        links.add(new URL(frameUrl));
                    }
                }
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return links;
    }

	public static void main(String args[]){
		ArrayList<URL> links = HtmlLinkParser.extracLinks("http://www.sina.com.cn/", new LinkFilter(){

			@Override
			public boolean accept(String url) {
				// TODO Auto-generated method stub
				if(url.startsWith("http://")){
					return true;
				}else {
					return false;
				}
			}
			
		});
		
		for(URL link:links){
			System.out.println(link.toString());
		}
	}
}
package com.se.util;

public interface LinkFilter {
	public boolean accept(String url);
}

你可能感兴趣的:(学习提取网页中的链接)