我尝试使用以下内容在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 »</a>
成为这个:
<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva »</a>
使用Chrome下载同一页面,&amp;遗骸&amp;
我是Charset / encoding的新手;任何人都能理解这个探索吗?
答案 0 :(得分:4)
Java部分工作正常。
Chrome正在欺骗你。在FireFox中,当我选择View -> Page Source
时,我会看到:
<a href="http://www.generation276.org/film/?m=200812&paged=3" >
Pagina successiva »</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&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&paged=2" >Pagina successiva »</a>
这很好。 &
是HTML中文字&符号的有效字符引用,但实体引用&
通常更为常见。
<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva »</a>
这是无效的HTML。
当您保存“仅限HTML”时,Chrome会保存原始HTML源代码而不做任何更改。保存“完成”时,必须重新编写页面以更改对其他资源的引用。
不幸的是,此处涉及的序列化过程似乎有一个错误,即无法&
- 逃避URL中的&符号。虽然浏览器通常会让您侥幸成功,但如果&符号右侧的单词碰巧生成有效的HTML实体名称或字符引用,它将会中断(修改您的URL)。
Chrome序列化属性值的其他地方(例如innerHTML
)不会受到这个相当差的错误的影响。
ETA:
我必须“忘掉”&amp; ...我该怎么办?
如果您尝试使用正则表达式从信息源中删除信息,则必须使用HTML解码器手动解码。没有一个内置的Java,所以你需要一个第三方工具,例如Apache Commons的工具,由seanizer链接。
然而,使用正则表达式进行刮擦是粗糙且不可靠的。我强烈建议使用an HTML parser加载文件并选择所需的数据。它将处理解码属性值和文本内容。