下载没有字符替换的网页

时间:2010-09-15 23:23:21

标签: java html http encoding entities

我尝试使用以下内容在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();

我下载页面,某些字符被实体替换:
这样的:
    <a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva &raquo;</a>
成为这个:
<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>
使用Chrome下载同一页面,&amp;遗骸&amp; 我是Charset / encoding的新手;任何人都能理解这个探索吗?

2 个答案:

答案 0 :(得分: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: How to decode HTML character entities in Java like HttpUtility.HtmlDecode?

因此答案也是一样的:

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

答案 1 :(得分: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)不会受到这个相当差的错误的影响。

ETA:

  

我必须“忘掉”&amp; ...我该怎么办?

如果您尝试使用正则表达式从信息源中删除信息,则必须使用HTML解码器手动解码。没有一个内置的Java,所以你需要一个第三方工具,例如Apache Commons的工具,由seanizer链接。

然而,使用正则表达式进行刮擦是粗糙且不可靠的。我强烈建议使用an HTML parser加载文件并选择所需的数据。它将处理解码属性值和文本内容。