2012-09-27 36 views
3

美好的一天,我是Java的新手,我试图从互联网上捕捉一些数据。如果我想举一个例子搜索谷歌并存储结果数量和搜索时间。 我想过使用jsoup DOM功能,但我无法弄清楚如何获取特定元素的值。在Java中从互联网中获取数据

如果我使用谷歌浏览器检查元素我很感兴趣,该位为

<div id="resultStats"> 
About 6,480,000,000 results 
<nobr> (0.26 seconds)&nbsp;</nobr> 
</div>  

那是我唯一可以开始工作,但文档不包括该元素。

import org.jsoup.nodes.Document; 


import java.io.IOException; 

public class google_time { 
    public static void main(String[] args) throws IOException { 
     String url = "https://www.google.com/webhp?hl=en&tab=Tw&q=data#hl=en&newwindow=1&output=search&sclient=psy-ab&q=data&oq=data&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483"; 

     Document doc = Jsoup.connect(url).get(); 
     System.out.println(doc); 

    } 
} 

那么如何我只得到该位resultStatic,并在那里的文本?

+1

jsoup提供您可以导航的DOM(文档对象模型),尝试阅读[示例](http://jsoup.org/cookbook/extracting-data/dom-navigation) – MadProgrammer

+0

也可以查看[this] (https://norrisshelton.wordpress.com/2011/01/27/jsoup-java-html-parser/),特别是关于'jquery'和[例子]的部分(http://jsoup.org/cookboo k/extract-data/selector-syntax) – MadProgrammer

回答

1

第一问题:

貌似网址https://www.google.com/webhp用于谷歌搜索页面的动态渲染。即使用AJAX获取搜索结果,然后使用JavaScript将其呈现在页面中。由于jsoup不是浏览器,并且不运行JavaScript,因此使用jsoup获得的html将不会有任何搜索结果。我们可以使用https://www.google.com/search。这将呈现一个正常的html页面,结果没有任何AJAX hooplah。但是从非浏览器源谷歌仍然块的请求,所以你不得不UserAgent头添加到您的Jsoup的要求是这样的:

Jsoup.connect(url) 
    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1;"+ 
     " en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") 
    .get(); 

而且最终的代码会是这个样子:

import org.jsoup.nodes.Document; 
import org.jsoup.select.Elements; 
import org.jsoup.nodes.Element; 
import org.jsoup.Jsoup; 
import java.util.Iterator; 
import java.io.IOException; 

public class GoogleScraper { 
    public static void main(String[] args) throws IOException { 
     String url = "https://www.google.com/search?"+ 
     "hl=en&tab=Tw&q=data#hl=en&newwindow=1&"+ 
     "output=search&sclient=psy-ab&q=data&oq=data"+ 
     "&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les"+ 
     "%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,"+ 
     "or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483"; 

     try{ 

      Document doc = Jsoup.connect(url) 
      .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1;"+ 
       " en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") 
      .get(); 

      //Prints the whole markup 
      //System.out.println(doc.toString()); 

      Elements resultDivElems = doc.select("div#resultStats"); 
      Iterator<Element> itr = resultDivElems.iterator(); 

      //Prints only what you need, ie the result details 
      while(itr.hasNext()){ 
       System.out.println(((Element)itr.next()).text()); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

谢谢,但是这并没有工作,你也必须使用Elements not Element,但仍然没有成功 – Michele87

+0

抱歉,更新了答案。看一看。 –