为什么通过正则表达式分析google的搜索结果页面代码来抓取结果的标题和链接不成功,而百度的却能成功?public class SaveURL{

public static String savepath_SaveURL="d:\\";//默认路径为D盘根目录
static String title=null;
static String link=null;
static String localFile=null;//保存为本地文件后的路径
static String res=null;

public static void go() {
    //String url= "http://www.baidu.com/s?wd=accenture&rn=10";
String url="http://www.google.com/search?hl=en&newwindow=1&q=hello&start=0&sa=N&num=30";
        String content = getPage(url);//得到url所对应的网页的内容
       

//        对应百度<table border="0" cellpadding="0" cellspacing="0">等的正则表达式
//        为什么快照的链接没有被下载下来?
        
        //String reg = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">.*?"+
//"<a.*? href=\"(.*?)\".*?>(.*?)</a>.*?</table>";        //Google对应的正则式
String reg = "<h2 class=r>"+"<a href=\"(.*?)\".*?>(.*?)</a></h2>";
Pattern p = Pattern.compile(reg,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher m = p.matcher(content);
        
        int i = 1;

        while(m.find())
        {
         title=m.group(2).replaceAll("<.*?>", "");//正则表达式
         link=m.group(1);
  
         System.out.println("----------------------------------------------");
        System.out.println("第"+i+"个标题:"+title);
        System.out.println("第"+i+"个链接:"+link);     

        i++;
        }//end of while }

      public static String getPage(String page) {
        try {
        
         URL url = new URL(page);
         HttpURLConnection con = (HttpURLConnection) url.openConnection();
            
//          以下是修正Server returned HTTP response code: 403 for URL的代码
//         通常是因为服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent
         con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)");
                 
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));
            StringBuilder b = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                b.append(line);
                b.append("\r\n");
            }
            return b.toString();
        } catch (FileNotFoundException ex) {
            System.out.println("NOT FOUND:" + page);
            return null;
        } catch (ConnectException ex) {
            System.out.println("Timeout:" + page);
            return null;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    
    public static void main(String[] args){
     go();
    }}如果打开google的结果目录页,查看源代码的结构,是和百度的差别不大啊,就是google的每个结果都是放在一个<div></div>中<h2 class=r>里边,而百度里边的是放在一个<table></table>标签里,为什么Google的会得不到呢?请高手帮忙解释下。
谢谢。

解决方案 »

  1.   

    这个说到底还是程序问题,仔细推敲下代码吧,既然百度能抓了,google不成问题
      

  2.   

    感觉挺奇怪的查看源代码的是:<div class=g><h2 class=r><a href="http://www.hello.com/" target=_blank class=l onmousedown="return clk(0,'','','res','1','')"><b>Hello</b></a></h2>而链接读出来的是:<div class=g><a href="http://www.hello.com/" target=_blank class=l onmousedown="return clk(0,'','','res','1','')"><b>Hello</b></a>h2 标签竟然没有了!把 h2 标签去掉,或者改成下面的表达式就行了。String reg = "<div class=g[^>]*><a href=\"(.+?)\"[^>]*>(.+?)</a>";
      

  3.   

    另外楼主 百度 的链接,也不是很好,会把下面相关搜索的链接也查出来,呵呵,改了一下:String reg = "<a onclick=\"return c[^>]+href=\"(.+?)\"[^>]*>(.*?)</a>";
      

  4.   

    这个我找到google的code,但不知道哪个才是,为什么高人说话通常都只说一半呢?
      

  5.   


    谢谢bao110908,是的,这个问题一直没有管它,因为正则式小弟真没学过