web-dev-qa-db-ja.com

HTMLをWebページからJavaの文字列に正しくロードする最も簡単な方法

タイトル通りです。

どうぞよろしくお願いいたします。

28
Mark F

非常に一般的なエラーは、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();
32
erickson

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);
4
altumano

私はこれを使います:

        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();

ほとんどの場合、機能します。

1
OscarRyz