将 html 从网页正确加载到 Java 中的字符串的最简单方法

Posted

技术标签:

【中文标题】将 html 从网页正确加载到 Java 中的字符串的最简单方法【英文标题】:Simplest way to correctly load html from web page into a string in Java 【发布时间】:2010-11-25 18:44:15 【问题描述】:

正如标题所说的那样。

帮助不胜感激!

【问题讨论】:

【参考方案1】:

一个极其常见的错误是未能正确地将 HTTP 响应从字节转换为字符。为此,您必须知道响应的字符编码。希望这被指定为“Content-Type”参数中的参数。但是将它放在正文中,作为meta 标签中的“http-equiv”属性也是一种选择。

因此,将页面正确加载到String 是非常复杂的,甚至像 HttpClient 这样的第三方库也不提供通用解决方案。

这是一个处理最常见情况的简单实现:

URL url = new URL("http://***.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();

【讨论】:

我知道这是一个很老的问题,但如果您能查看***.com/questions/7615014/…,我将不胜感激。 请将默认编码更改为“UTF-8”(trends.builtwith.com/encoding)。人们正在从您的(非常好的)答案中学习! @TalWeiss 受欢迎程度无关紧要; ISO-8859-1 是the specified default.。 “当发送者没有提供明确的字符集参数时,‘文本’类型的媒体子类型被定义为在通过 HTTP 接收时具有默认的字符集值‘ISO-8859-1’。字符集中的数据不是‘ISO- 8859-1' 或其子集必须标有适当的字符集值。" @erickson 我明白你的意思,但这是用于阅读网络的代码,人们只是希望他们的代码能够工作。正如您所说的“希望最好” - 我只是不确定最好的是什么,就您的代码在未指定编码时实际工作的可能性而言。我猜你在全球范围内使用 UTF-8 的几率更高。【参考方案2】:

您仍然可以使用org.apache.commons.io.IOUtils 将其简化一点:

URL url = new URL("http://***.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();

它在大多数情况下都有效。

【讨论】:

结果字符串的末尾会有一个额外的“\n”。

以上是关于将 html 从网页正确加载到 Java 中的字符串的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

从数据库加载数据并将其加载到 Vapor 3 中的视图的正确方法?

WKWebView 没有从 language.url 获取正确的语言字符串

Thymeleaf 未在页面上显示正确的字符串,但从模型中正确打印

网页视图加载

如何显示网页的加载过程

用 Pandas 读写网页中的 HTML 表格数据