2011-08-21 37 views
4

我想從我的servlet中讀取給定URL的源代碼(HTML標籤)。如何從servlet獲取給定URL的來源?

例如,URL是http://www.google.com,我的servlet需要讀取HTML源代碼。爲什麼我需要這樣呢,我的網絡應用程序將會讀取其他網頁並獲取有用的內容並對其進行處理。

可以說,我的應用程序顯示一個城市中的一個類別的商店列表。如何生成該列表是,我的Web應用程序(servlet)通過給定的網頁顯示各種商店並閱讀內容。通過源代碼,我的servlet可以過濾該源代碼並獲取有用的詳細信息。最後創建列表(因爲我的servlet無法訪問給定URL的Web應用程序數據庫)。

任何知道任何解決方案? (特別是我需要這樣做的servlet)如果你認爲有另一種最好的方式來從另一個網站獲取詳細信息,請讓我知道。

謝謝

回答

2

你要做的就是所謂的網頁抓取。皮艇和類似的網站做到這一點。在網上搜索它;)在Java中,你可以做到這一點。

URL url = new URL(<your URL>); 

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
String inputLine; 
StringBuffer response = new StringBuffer(); 

while ((inputLine = in.readLine()) != null) { 
    response.append(inputLine + "\n"); 
} 

in.close(); 

響應會爲您提供該網址返回的完整HTML內容。

+0

非常感謝您對SRINIVAS我們的代碼和信息。 –

6

看看jsoup用於獲取和解析HTML。

Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 
Elements newsHeadlines = doc.select("#mp-itn b a"); 
+0

謝謝Mr.Jeremy :) –

8

您不需要servlet從遠程服務器讀取數據。您可以使用java.net.URLjava.net.URLConnection類從HTTP服務器讀取遠程內容。例如,

InputStream input = (InputStream) new URL("http://www.google.com").getContent(); 
+0

感謝安德烈.. :) –

0

有幾種解決方案。

最簡單的是使用正則表達式。如果你只是想從像<a href="THE URL">這樣的標籤中提取鏈接,就像<a\s+href\s*=\s*["']?(.*?)["']\s*/>這樣的用戶正則表達式。組(1)包含URL。現在只需創建Matcher並遍歷文檔,而matcher.find()爲true。

下一個解決方案是使用XML解析器來解析HTML。如果你的網站是使用格式良好的HTML(XHTML)編寫的,這將工作得很好。由於並非總是如此,所以此解決方案僅適用於選定的站點。

下一個解決方案是使用內置的HTML解析器的java:http://java.sun.com/products/jfc/tsc/articles/bookmarks/

下,最靈活的方式是使用「真實」的HTML解析器,更是基於Java的HTML瀏覽器:Java HTML Parsing

現在取決於你的任務細節。如果解析靜態錨標籤就足夠了,用戶正則表達式。如果不選擇下一種方法之一。

+0

非常感謝:) –

0

正如人們所說,您可以使用核心類java.net.URL和java.net.URLConnection來獲取網頁。 但更有用的是Apache HttpClient。在此處查找文檔&示例:http://hc.apache.org/

1

如上所述,您不需要servlet來達到此目的。Servlet API用於響應請求,servlet容器在服務器端運行。如果我理解你的話,你就不需要任何服務器來達到這個目的。你只需要簡單的http客戶端模擬器。我希望下面的例子將幫助您:

import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class SimpleHttpClient { 

public String execute() { 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet("google.com"); 
     StringBuilder content = new StringBuilder(); 

     try { 
      HttpResponse response = httpClient.execute(httpGet); 

      int bufferLength = 1024; 
      byte[] buffer = new byte[bufferLength]; 
      InputStream is = response.getEntity().getContent(); 

      while (is.read(buffer) != -1) { 
       content.append(new String(buffer, "UTF-8")); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return content.toString(); 
    } 
}