Perl能够很好提取网页中的信息,那么Java也能象它一样强大吗?
如果给定一个URL,是不是Java会有特定的方法直接就获得到页面的内容了?
使用java会很麻烦吗?
希望各位多多指点

解决方案 »

  1.   

    可以把网页封状成一个URL对象,然后调用方法就可以做到了.
      

  2.   

    谢谢mofeir和xq_zz,只怪小弟太弱了,请问如何实现封装网页成一个URL对象?
      

  3.   

    URL url = new URL("http://community.csdn.net/Expert/topic/4152/4152614.xml?temp=.3312342");
      

  4.   

    要用到正则表达式,在《java编程思想》流这一章 有一个的例子,他实现给一个URL 然后提取这个URL页面里的超连接 你可以去看以下
      

  5.   

    谢谢mofeir,我试试
    to apple21 :今天刚买了本《java编程思想》,好好看看去,
      

  6.   

    apple21(编姑娘的小花篮) 我在第十二章(第三版的)I/O系统中怎么没有找到这个例子?是这章吗?我也看见有正则表达式了
      

  7.   

    try {
            // Create a URL for the desired page
                URL url = new URL("http://www.google.com");
                // Read all the text returned by the server
                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                String str;
                while ((str = in.readLine()) != null) {
                    // str is one line of text; readLine() strips the newline character(s)
                }
                in.close();
            } catch (MalformedURLException e) {
            } catch (IOException e) {
            }
      

  8.   

    大家帮我看看,下面这段代码和masse给的差不多,不同的是我用WinGate代理上网的,所以设了代理服务器,可是运行的时候httpcon.getResponseCode()=-1,结果就不能正确运行,这是为什么?是不是我的代理设置有问题,这些也是从网上找的。         String proxy = "192.1.1.2",
           port = "9808",
           username = "mxl",
           password = "mxlcaca";
    Authenticator.setDefault(new SimpleAuthenticator(
           username,password));
    Properties systemProperties = System.getProperties(); systemProperties.setProperty("http.proxyHost",proxy);
    systemProperties.setProperty("http.proxyPort",port);          currentUrl=new URL(url);
                URLConnection con=currentUrl.openConnection();
                HttpURLConnection httpcon=(HttpURLConnection) con;
                con.connect();
                System.out.println(httpcon.getResponseCode());
                if(httpcon.getResponseCode()==HttpURLConnection.HTTP_OK){
                    if(httpcon.getContentType().startsWith("text/html")){
                        InputStreamReader in=new InputStreamReader(con.getInputStream());
                        BufferedReader buf=new BufferedReader(in);
                           InputStream ins=con.getInputStream();
                           int c;                       while (((c=ins.read())!=-1))
                           {
                           System.out.print((char)c);
                           }
                        buf.close();
                        in.close();
      

  9.   

    仙人掌:在用代理的程序前面需要加三句话,你少了第一句
    System.getProperties().put("proxySet","true");//你少了这句,加上就OK
    System.getProperties().setProperty( "http.proxyHost","代理地址");
    System.getProperties().setProperty( "http.proxyPort","代理端口");
      

  10.   

    谢谢masse,代理问题解决了
    现在我想问问,我从网页中获得内容放在BufferedRead中了,如果使用正则表达式抽取需要的数据,是直接对BufferedRead进行操作吗?循环调用它的readLine()是不是太慢了?有没有更好的办法可以一次就可以找出来的?
      

  11.   

    仙人掌:
    可以用char[]来读,一次读取一块,块大小可以自己定义。
    正则表达式抽取所需要的数据,
    如果html本身是格式良好,可以借鉴htmlparser或者jbuilder的http unit之类,
    如果格式不是良好的,可能就只有自己写正则表达式对抽取出来的数据进行操作。最好是所有数据都读完了,得到一个完整的String进行操作。
    对str进行操作,只是一部分。也不知道有没有说清楚……呵呵
      

  12.   

    谢谢 masse
    我用了readLine(),能够解决问题,我想char[]也是一个好办法,我也尝试了htmlparser,不过不知道怎么用它,而且感觉我要实现的功能应该都是不太复杂的,所以就没用了。
      

  13.   

    readLine还是慢啊,可不可以一次性对整个BufferedRead中的数据做检索操作?
    使用char[]主要是不能确定大小,担心有的重要信息会因此被分割开,从而就找不到了