当前位置: 代码迷 >> J2SE >> 关于网页抓取链接内容的正则表达式,该怎么处理
  详细解决方案

关于网页抓取链接内容的正则表达式,该怎么处理

热度:204   发布时间:2016-04-24 01:33:48.0
关于网页抓取链接内容的正则表达式
小弟最近研究网页抓取,可惜这个正则困扰我很长时间。。

Java code
package com.test;import java.io.*;import java.net.*;public class du_wangye_0100 {    /**     * @param args     */    public static void main(String[] args) throws IOException{                String htmlurl = "http://www.qq163.com";                String tmp = readhtml(htmlurl,"gbk");        get_a(tmp);                String str = "<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a> ┊ <a href=\"http://www.3533.com/phone/\">手机大全</a> ┊ <a href=\"http://www.ip138.com/\">iP查询</a> ┊ <a href=\"http://game.3533.com/zhuti/\" >手机主题</a>";        String regex = "<a href=\".+[^:]\"\\S+</a>";        Pattern p = Pattern.compile(regex);        Matcher m = p.matcher(str);        if (m.find()) {            System.out.println(m.group());        }            }        static String readhtml(String htmlurl,String charset) throws IOException{        StringBuffer sb = new StringBuffer();        URL url = new URL(htmlurl);        URLConnection conn = url.openConnection();        conn.setDoOutput(true);        InputStream in = url.openStream();        String line;        BufferedReader br = new BufferedReader(new InputStreamReader(in,charset));        System.out.println("开始读取网页");        while((line = br.readLine())!= null){                        sb.append(line);        }        br.close();        in.close();        return sb.toString();    }        static void get_a(String line){        String regx;        regx="<a href=\"\\S+\"";        //regx="<a href=\".+\"\\S+>\\w+</a>";        Pattern p = Pattern.compile(regx);                Matcher m = p.matcher(line);        while(m.find()){            System.out.println(m.group());        }            }    }


因为读取的网页内容会组成一个String返回,我想读取在<a href=>。。。</a>这种字符串,是在不知道该怎么写了,比如
String str = "<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>;

我自己写得是String regex = "<a href=\".+[^:]\"\\S+</a>";
还试过很多String regex = "<a href=\"\\S+\"\\S+</a>";

哪位高手出个主意把那个字符串读取出<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a>
<a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>
这样的

------解决方案--------------------
Java code
    URL url = new URL("http://www.qq163.com");    Document doc = Jsoup.parse(url,30000);    Elements links = doc.select("a");    for(Element link:links){        //        System.out.println(link);        System.out.println(link.attr("href"));        System.out.println(link.attr("target"));        System.out.println(link.text());    }
------解决方案--------------------
我刚研究了一下,写这个正则表达式确实非同凡响,最近也涉及到这个东西,一楼的思路很好,不过那个Jsoup不知道是什么东西,jdk里面好像没有。
这道提醒了一种思路,把html代码转dom,然后在解析,这样准确度很高啊。正则表达式匹配的容易出问题。
可以考虑用可行的办法把html转化成dom,Java应该可以。其实我有一种思路,把你得到的html用js按照你的规则解析效果会非常好。getElementByTag("...")这类东西..,然后在组织起来。
------解决方案--------------------
Java code
public static void main(String[] args) {        String str = "sfsf<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>sfdsf";        Pattern p = Pattern.compile("<a href=.*?>.*?</a>");        Matcher m = p.matcher(str);        while(m.find()){            System.out.println(m.group());        }    }