2010-03-11 107 views
23

我正在研究一個需要從鏈接中獲取網頁源代碼的應用程序,然後解析該網頁中的html。如何從android中的html鏈接獲取頁面的html源代碼?

你能給我一些例子,或者從哪裏開始寫點什麼開始寫這樣的應用程序?

+0

這是不完全清楚你想要做什麼?我想你想要得到的網頁,然後解析HTML? – Janusz 2010-03-11 08:43:37

+0

我正在處理HTML解析。第一個任務,我想從我的HTML鏈接獲取HTML源代碼。怎麼做?對不起我最差的英語。感謝鼓勵我。 – Praveen 2010-03-11 09:09:46

+0

沒問題我試着重新解釋一下你的問題。我希望仍然是同樣的問題:)對於進一步的問題,你的問題是非常廣泛的。我們喜歡有點特別的問題,並且在您的應用中遇到單個問題,可能會使用一些示例代碼來解釋您的問題...... – Janusz 2010-03-11 09:24:15

回答

44

您可以使用HttpClient像這樣執行HTTP GET和檢索HTML響應,東西:

HttpClient client = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url); 
HttpResponse response = client.execute(request); 

String html = ""; 
InputStream in = response.getEntity().getContent(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
StringBuilder str = new StringBuilder(); 
String line = null; 
while((line = reader.readLine()) != null) 
{ 
    str.append(line); 
} 
in.close(); 
html = str.toString(); 
+2

不好,我得到一個未知的主機例外,但我可以打開瀏覽器到我的同一個URL。 – Rhyous 2011-10-24 04:14:36

+9

得到未知的主機例外,對我來說這是一個權利問題,增加了這個'\t <使用權限android:name =「android.permission.INTERNET」/>'清單 – Michel 2012-01-23 10:01:30

+0

有沒有什麼方法可以讀取所有內容一步到位,沒有逐行閱讀? – Mehmed 2013-02-24 11:21:22

0

如果你看看herehere,你會看到,你不能這樣做,直接與Android API,你需要一個外部librairy ...

您可以在這裏2之間選擇的上文,如果你需要一個外部的圖書館。

+1

取決於您所擁有並希望解析的網頁類型。如果你只是在尋找一些特定的值,你完全可以通過一些正則表達式來獲取這些值:)如果該庫的用例足夠複雜 – Janusz 2010-03-11 09:19:38

+0

足夠公平,我只會使用一個新的外部庫。正則表達式非常易於使用。但是,您需要加載整個頁面並抓取您感興趣的每個標籤,而不是自定義正則表達式? – Sephy 2010-03-11 10:51:28

+0

在使用正則表達式之前,我們需要將html源代碼作爲字符串。怎麼做? – Praveen 2010-03-11 12:54:21

6
public class RetrieveSiteData extends AsyncTask<String, Void, String> { 
@Override 
protected String doInBackground(String... urls) { 
    StringBuilder builder = new StringBuilder(100000); 

    for (String url : urls) { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     try { 
      HttpResponse execute = client.execute(httpGet); 
      InputStream content = execute.getEntity().getContent(); 

      BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
      String s = ""; 
      while ((s = buffer.readLine()) != null) { 
       builder.append(s); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    return builder.toString(); 
} 

@Override 
protected void onPostExecute(String result) { 

} 
} 
+0

它正在工作,但很慢.. – Nepster 2014-05-22 11:08:14

16

我建議jsoup

根據他們的網站:

獲取維基百科網頁,它解析爲DOM,並從在新聞欄目中選擇標題爲元素(在線樣本)的列表:

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

入門:

  1. Download的jsoup罐子核心庫
  2. 閱讀cookbook介紹
  3. 享受!

玩得開心, 保羅

0

這樣稱呼它

new RetrieveFeedTask(new OnTaskFinished() 
     { 
      @Override 
      public void onFeedRetrieved(String feeds) 
      { 
       //do whatever you want to do with the feeds 
      } 
     }).execute("http://enterurlhere.com"); 

RetrieveFeedTask.class

class RetrieveFeedTask extends AsyncTask<String, Void, String> 
{ 
    String HTML_response= ""; 

    OnTaskFinished onOurTaskFinished; 


    public RetrieveFeedTask(OnTaskFinished onTaskFinished) 
    { 
     onOurTaskFinished = onTaskFinished; 
    } 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... urls) 
    { 
     try 
     { 
      URL url = new URL(urls[0]); // enter your url here which to download 

      URLConnection conn = url.openConnection(); 

      // open the stream and put it into BufferedReader 
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      String inputLine; 

      while ((inputLine = br.readLine()) != null) 
      { 
       // System.out.println(inputLine); 
       HTML_response += inputLine; 
      } 
      br.close(); 

      System.out.println("Done"); 

     } 
     catch (MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     return HTML_response; 
    } 

    @Override 
    protected void onPostExecute(String feed) 
    { 
     onOurTaskFinished.onFeedRetrieved(feed); 
    } 
} 

OnTaskFinished.java

public interface OnTaskFinished 
{ 
    public void onFeedRetrieved(String feeds); 
} 
+0

我在哪裏定義'url_search'和'HTML_Resonse'? – user1091524 2014-12-25 20:45:41

+0

另外,Parser(feed)是什麼;參考? Alt_Enter找不到Parser類。 – user1091524 2014-12-25 22:01:18

+0

請修正這個錯誤'Cannot resolve symbol'HTML_Resonse''and'Cannot resolve method'Parser(java.lang.String)''@Nepster – Florida 2015-06-16 05:55:23

12

這個問題有點舊,但我想我現在應該發佈我的答案,現在DefaultHttpClient,HttpGet等已被棄用。給定一個URL,這個函數應該得到並返回HTML。

public static String getHtml(String url) throws IOException { 
    // Build and set timeout values for the request. 
    URLConnection connection = (new URL(url)).openConnection(); 
    connection.setConnectTimeout(5000); 
    connection.setReadTimeout(5000); 
    connection.connect(); 

    // Read and store the result line by line then return the entire string. 
    InputStream in = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder html = new StringBuilder(); 
    for (String line; (line = reader.readLine()) != null;) { 
     html.append(line); 
    } 
    in.close(); 

    return html.toString(); 
} 
+0

你能告訴我如何將這個函數數據發送到mainActivity的webview onload嗎? – user1788736 2017-11-20 00:21:15

相關問題