2010-09-15 3 views
1

Я tryng, чтобы загрузить веб-страницу в 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, то & остается &.
Я новый в Charset/encoding; может ли кто-нибудь понять этот вопрос?

ответ

4

Часть Java работает отлично.

Хром обманывает вас там. В FireFox, когда я выбираю View -> Page Source, я вижу это:

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

в то время как с FireBug/Осмотрите элемент Я вижу это:

<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 проект.

+0

Итак, вы говорите, что работает Java-код. Хорошо, как я могу «отменить» URL? Я имею в виду в общем. Спасибо –

+0

см. Мой обновленный ответ –

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-адресе. В то время как браузеры, как правило, позволяют вам избежать этого, он сломается (искажает ваш URL), если слово справа от амперсанда произойдет, чтобы создать допустимое имя или ссылку на объект HTML.

Другие места, где значения атрибутов сериализаций Chrome, такие как innerHTML, не страдают от этой довольно бедной ошибки.

ETA:

Я должен "экранирования в" & ... как я могу сделать?

Если вы попытаетесь очистить информацию из источника, используя регулярное выражение, вам придется декодировать вручную с помощью HTML-декодера. Не существует встроенного Java-устройства, поэтому вам понадобится сторонний инструмент, например, от Apache Commons, связанный с seanizer.

Однако скребок с регулярным выражением является грубым и ненадежным. Я бы настоятельно предложил использовать an HTML parser, чтобы загрузить файл и выбрать нужные данные. Он будет обрабатывать значения атрибутов декодирования и текстовое содержимое.

+0

Мое внимание сосредоточено на JAVA, мне нужно «unescape» & ... как я могу это сделать? благодаря –