2009-09-04 3 views
26

タイトルの言うとおりです。WebページからhtmlをJavaの文字列に正しくロードする最も簡単な方法

大変助かりました!

 BufferedReader bufferedReader = new BufferedReader( 
            new InputStreamReader( 
              new URL(urlToSeach) 
               .openConnection() 
               .getInputStream())); 

     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while((line = bufferedReader.readLine()) != null) { 
      sb.append(line) ; 
      sb.append("\n"); 
     } 
     .... in finally.... 
     buffer.close(); 

それはほとんどの時間の作品:

答えて

30

よくあるエラーは、HTTP応答をバイトから文字に正しく変換できないことです。これを行うには、応答の文字エンコーディングを知る必要があります。うまくいけば、これは "Content-Type"パラメータのパラメータとして指定されています。しかし、それを身体自体に入れても、metaタグの "http-equiv"属性として使うこともできます。

したがって、Stringにページを読み込むのは驚くほど複雑で、HttpClientなどのサードパーティライブラリでさえも一般的な解決策はありません。

ここでは最も一般的なケースを処理する単純な実装です:

URL url = new URL("http://stackoverflow.com/questions/1381617"); 
URLConnection con = url.openConnection(); 
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*"); 
Matcher m = p.matcher(con.getContentType()); 
/* If Content-Type doesn't match this pre-conception, choose default and 
* hope for the best. */ 
String charset = m.matches() ? m.group(1) : "ISO-8859-1"; 
Reader r = new InputStreamReader(con.getInputStream(), charset); 
StringBuilder buf = new StringBuilder(); 
while (true) { 
    int ch = r.read(); 
    if (ch < 0) 
    break; 
    buf.append((char) ch); 
} 
String str = buf.toString(); 
+0

これは本当に古い質問ですが、http://stackoverflow.com/questions/7615014/encoding-issues-crawling-i18n-websitesをチェックできれば、本当に感謝しています。 – dimo414

+0

デフォルトのエンコードを「UTF-8」(http://trends.builtwith.com/encoding)に変更してください。人々はあなたの(非常に良い)答えから学んでいます! –

+4

@TalWeiss人気は問題ではありません。 ISO-8859-1は[指定されたデフォルトです。](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1)です。 "明示的なcharsetパラメータが送信者によって提供されていない場合、 'text'タイプのメディアサブタイプは、HTTP経由で受信したときにデフォルトのcharset値 'ISO-8859-1' 8859-1 'またはその部分集合は適切な文字セット値でラベル付けされなければならない(MUST)。 – erickson

1

は、私はこれを使用しています。

+0

はで余分な「\ n」はあるでしょう結果の文字列の終わり。 –

4

あなたはまだそれをorg.apache.commons.io.IOUtilsを使用してビットを簡素化することができます。

URL url = new URL("http://stackoverflow.com/questions/1381617"); 
URLConnection con = url.openConnection(); 
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*"); 
Matcher m = p.matcher(con.getContentType()); 
/* If Content-Type doesn't match this pre-conception, choose default and 
* hope for the best. */ 
String charset = m.matches() ? m.group(1) : "ISO-8859-1"; 
String str = IOUtils.toString(con.getInputStream(), charset);