Скачать веб-страницу без замены персонажа - PullRequest
1 голос
/ 16 сентября 2010

Я пытаюсь загрузить веб-страницу в 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>
стать таким:
<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>
При загрузке той же страницы с помощью Chrome & остается &.
Я новичок в кодировке / кодировании;Кто-нибудь может понять зонд?

Ответы [ 2 ]

4 голосов
/ 16 сентября 2010

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: как декодировать символьные объекты HTML в Java, например HttpUtility.HtmlDecode?

И, следовательно, ответ также тот же:

Использовать StringEscapeUtils.unescapeHTML (String) из проекта Apache Commons / Lang .

2 голосов
/ 16 сентября 2010

Фактический источник этой страницы говорит:

<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-код без изменений. Когда вы сохраняете «Complete», он должен переписать страницу, чтобы изменить ссылки на другие ресурсы.

К сожалению, в процессе сериализации, связанном с этим, возникает ошибка, связанная с невозможностью & - убрать амперсанды в URL. Хотя браузеры, как правило, позволяют вам сойти с рук, он сломается (покалечит ваш URL), если слово справа от амперсанда будет содержать действительное имя объекта HTML или ссылку на символ.

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

ETA:

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

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

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

...