1

我正在尝试使用以下内容在 java 中下载网页:

URL url = new URL("www.jksfljasdlfas.com");
FIle to = new File("/home/test/test.html");

Reader in = new InputStreamReader(url.openStream(), "UTF-8");
Writer out = new OutputStreamWriter(new FileOutputStream(to), "UTF-8");

int c;
while((c = in.read()) != -1){
    out.write(c);
}
in.close();
out.close();

我下载了页面,一些字符被实体替换了:
this:
<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva &raquo;</a>
变成 this:
<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>
用 Chrome 下载相同的页面,& 仍然是 &。
我是字符集/编码的新手;有人能理解这个问题吗?

4

2 回答 2

4

Java 部分运行良好。

Chrome 在那里欺骗了你。在 FireFox 中,当我选择 时View -> Page Source,我看到:

<a href="http://www.generation276.org/film/?m=200812&#038;paged=3" >
Pagina successiva &raquo;</a>

而使用 FireBug / Inspect Element 我看到了这个:

<a href="http://www.generation276.org/film/?m=200812&paged=3" style="">
Pagina successiva »</a>

并将其复制到剪贴板,如下所示:

<a href="http://www.generation276.org/film/?m=200812&amp;paged=3" style="">
Pagina successiva »</a>

浏览器并不总是向您显示真正存在的内容。


您问题的第二部分与上一个问题相同:

Java:如何在 Java 中解码 HTML 字符实体,如 HttpUtility.HtmlDecode?

因此答案也是一样的:

使用Apache Commons / Lang项目中的StringEscapeUtils.unescapeHTML(String) 。

于 2010-09-15T23:49:41.947 回答
2

该页面的实际来源确实说:

<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>

这很好。&#038;是 HTML 中文字 & 字符的有效字符引用,尽管实体引用&amp;通常更常见。

<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva &raquo;</a>

这是无效的 HTML。

当您保存“仅 HTML”时,Chrome 会保存原始 HTML 源而不做任何更改。当您保存“完成”时,它必须重新编写页面以更改对其他资源的引用。

不幸的是,其中涉及的序列化过程似乎存在一个错误,即无法&转义 URL 中的 & 符号。虽然浏览器通常会让您侥幸逃脱,但如果与号右侧的单词恰好构成有效的 HTML 实体名称或字符引用,它将破坏(破坏您的 URL)。

Chrome 序列化属性值的其他地方,例如innerHTML,不会遇到这个相当糟糕的错误。

预计到达时间:

我必须“逃避” &... 我该怎么办?

如果您尝试使用正则表达式从源中抓取信息,则必须使用 HTML 解码器手动解码。Java 没有内置工具,因此您需要第三方工具,例如由 seanizer 链接的 Apache Commons 提供的工具。

但是,使用正则表达式进行抓取是粗糙且不可靠的。我强烈建议使用HTML 解析器来加载文件并挑选出你想要的数据。它将处理解码属性值和文本内容。

于 2010-09-15T23:51:17.417 回答