Самый простой способ правильно загрузить html с веб-страницы в строку в Java

То, что говорится в названии.

Помогите с благодарностью!

Ответ 1

Чрезвычайно распространенной ошибкой является неспособность правильно преобразовать HTTP-ответ от байтов к символам. Для этого вам нужно знать кодировку символов ответа. Надеюсь, это указано как параметр в параметре "Content-Type". Но поместить его в тело, поскольку атрибут "http-equiv" в теге meta также является опцией.

Итак, удивительно сложно правильно загрузить страницу в 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();

Ответ 2

Вы можете немного упростить его с помощью 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);

Ответ 3

Я использую это:

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

Он работает большую часть времени.