Не грузится страница с нижним подчёркиванием в адресе.

Рейтинг: 2Ответов: 1Опубликовано: 23.03.2015

Дано:

Есть страница на сайте с адресом вида "ххх_ххх.yyy.zzz".

Проблема:

Грузиться кодом (пробовал 2 варианта, кои работают на всех ссылках, кроме означенной) сия страница никак не хочет. Остальные страницы аналогичным кодом грузятся, в браузере эмулятора эта страница тоже грузится без проблем.

Подозрения:

Гугленье наводит на неутешительные мысли. Мол, нехорошо иметь "_" в адресе.

Вопрос:

Правильно ли я нагуглил, и если да, то можно это как-то обойти? Сайт мне неподвластен, сам адрес поменять не могу.

UPD_0:

Может чрез WebView получится достать html, коли страница в браузере грузится? Утром попробую.

UPD_0.1:

Попробовал. Сработало. Костыль ужасен, но работает. Код в моем ответе.

UPD_1:

Сомневаюсь что приведение тут конкретного адреса поможет, но раз просят, то вот он: тык.

Вот сейчас попробовал, по совету @SuperCreeper, конвертить в Punycode. Тут и тут адрес без изменений остался, а тут ругнулся (как я понял) на ":" (Error:: Disallowed/Unassigned 3A) и вернул всё тот же адрес.

По совету @abalckin, пробовал заменить символ:

this.url=this.url.replaceAll("_", "%5F");
this.url=this.url.replaceAll("1", "%31");
this.url=this.url.replaceAll("4", "%34");
this.url=this.url.replaceAll("-", "%2D");

Что ничего не меняет. Не помогает и вот это:

url = URLDecoder.decode(url, "utf-8");

Пользую библиотеку HTMLCleaner. До сего момента никаких проблем с ней не было. Пробовал и какой-то длинный код со stackoverflow. Приводить его смысла не вижу, ибо ведёт себя точно также - всё грузит как и HTMLCleaner кроме указанного выше адреса.

UPD_2:

Попробовал у своего хостера создать на своём сайте поддомен с "_" в адресе. Предсказуемо был послан лесом.

Ответы

▲ 1Принят

Итого:

Получить HTML получилось с помощью WebView. Всё доброе и светлое во мне протестует против такого костыля. Вот костыль:

1) Ловим (кидаем) ошибку (проверяем, например, на наличие "_" в адресе).

2) Поймав, в UI потоке создаём WebView

final WebView webView = new WebView(context);
//включаем JavaScript ибо он нам пондобится
webView.getSettings().setJavaScriptEnabled(true);
//вот он и понадобился. Именно в него придёт HTML загруженной страницы
//сам интерфейс см. ниже.
webView.addJavascriptInterface(new LoadListener(), "HTMLOUT");
webView.setWebViewClient(new WebViewClient()
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        return true;
    }
    //когда страница загрузится вот этот код вытащит из неё её HTML содержимое
    public void onPageFinished(WebView view, String url)
    {                        view.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    }
});
//теперь можно саму страницу грузить
String link="http://xxx_xxx.yyy.xxx";
webView.loadUrl(link);

3) А вот и интерфейс, в коем мы получим искомый HTML

class LoadListener
{
    public void processHTML(String html)
    {
        Log.e("result", html);
    }
}

Вышеприведённый код отсюда: тык.

P.S. Всё это ужасно, буду рад, ежели найдётся решение изящнее, но пока придётся пользовать сей костыль.

UPD_0:

По неясным мне причинам вышеприведённый код отказывается делать что-то большее с полученным Html-ем, чем его выведение в логи...

Засим пользую несколько изменённый вариант отсюда: тык

Там даже чуть меньше кода. В вышеприведённом коде надо убрать интерфейс и заменить метод setWebViewClient(). И добавить setWebChromeClient(). Подробности по ссылке.