日期:2014-05-20  浏览次数:20776 次

关于网页抓取链接内容的正则表达式
小弟最近研究网页抓取,可惜这个正则困扰我很长时间。。

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());
        }
    }