ss123dsd 2011-05-16 13:54
浏览 350
已采纳

如何改

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.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}

// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
    try {
        Parser parser = new Parser(url);
        parser.setEncoding("utf-8");
        // 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
        NodeFilter frameFilter = new NodeFilter() {
            public boolean accept(Node node) {
                if (node.getText().contains("category")
                 || node.getText().contains("mcategory")
                //|| node.getText().startsWith("frame src=")
                // || node.getText().startsWith("img src=")
                ) {
                    return true;
                } else {
                    return false;
                }
            }
        };
        // OrFilter 来设置过滤 <a> 标签,<img> 标签和 <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
                String text = link.getLinkText();// 链接文字
                System.out.println(linkUrl + "********" + text);
            } else if (tag instanceof ImageTag)// <img> 标签
            {
                ImageTag image = (ImageTag) list.elementAt(i);
                System.out.print(image.getImageURL() + "********");// 图片地址
                System.out.println(image.getText());// 图片文字
            } else// <frame> 标签
            {
                // 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
                String frame = tag.getText();
                int start = frame.indexOf("src=");
                frame = frame.substring(start);
                int end = frame.indexOf(" ");
                if (end == -1)
                    end = frame.indexOf(">");
                frame = frame.substring(5, end - 1);
                System.out.println(frame);
            }
        }
    } catch (ParserException e) {
        e.printStackTrace();
    }
}

}

有运行结果就是最后报空指针异常

  • 写回答

14条回答 默认 最新

  • redstarofsleep 2011-05-17 13:50
    关注

    [code="java"]
    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.ImageTag;

    import org.htmlparser.tags.LinkTag;

    import org.htmlparser.util.NodeList;

    import org.htmlparser.util.ParserException;

    public class Catenate {   
        public static void main(String[] args) throws Exception {   
            String url = "http://www.bradfordexchange.com/";   
            extracLinks(url);   
        }   
    
        // 获取一个网页上所有的链接和图片链接   
        @SuppressWarnings("serial")   
        public static void extracLinks(String url) {   
            try {   
                Parser parser = new Parser(url);   
                parser.setEncoding("utf-8");   
                // 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接   
                NodeFilter frameFilter = new NodeFilter() {   
                    public boolean accept(Node node) {   
                        if (node.getText().contains("category")   
                                || node.getText().contains("mcategory")   
                                //|| node.getText().startsWith("frame src=")   
                                // || node.getText().startsWith("img src=")   
                        ) {   
                            return true;   
                        } else {   
                            return false;   
                        }   
                    }   
                };   
                // OrFilter 来设置过滤 <a> 标签,<img> 标签和 <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   
                        String text = link.getLinkText();// 链接文字   
                        System.out.println(linkUrl + "********" + text);   
                    } else if (tag instanceof ImageTag)// <img> 标签   
                    {   
                        ImageTag image = (ImageTag) list.elementAt(i);   
                        System.out.print(image.getImageURL() + "********");// 图片地址   
                        System.out.println(image.getText());// 图片文字   
                    } else// <frame> 标签   
                    {   
                        // 提取 frame 里 src 属性的链接如 <frame src="test.html"/>   
                        String frame = tag.getText();   
                        int start = frame.indexOf("src=");   
                        if (start >= 0) {  
                            frame = frame.substring(start);   
                            int end = frame.indexOf(" ");   
                            if (end == -1)   
                                end = frame.indexOf(">");   
                            frame = frame.substring(5, end - 1);   
                            System.out.println(frame);  
                        }  
                    }   
                }   
            } catch (ParserException e) {   
                e.printStackTrace();   
            }   
        }   
    
    }   
    

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(13条)

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的