将 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 获取正确的语言字符串