может ли jsoup обрабатывать перенаправление мета-обновления

У меня проблема с использованием jsoup. Я пытаюсь получить документ из URL-адреса, который будет перенаправлять на другой URL-адрес на основе URL-адреса метаобновления, который не работает, чтобы четко объяснить, ввожу ли я URL-адрес веб-сайта с именем http://www.amerisourcebergendrug.com, который будет автоматически перенаправлять на http://www.amerisourcebergendrug.com/abcdrug/ в зависимости от URL-адреса метаобновления, но мой jsoup все еще придерживается http://www.amerisourcebergendrug.com, а не перенаправлять и получать данные с http://www.amerisourcebergendrug.com/abcdrug/

Document doc = Jsoup.connect("http://www.amerisourcebergendrug.com").get();

Я также пытался использовать,

Document doc = Jsoup.connect("http://www.amerisourcebergendrug.com").followRedirects(true).get();

но оба не работают

Любое обходное решение для этого?

Обновление. Страница может использовать мета-методы перенаправления обновления.


person Karthik    schedule 08.09.2011    source источник
comment
Возможно, сервер возвращает неверный статус для редиректов. Если возможно, добавьте реальный URL-адрес, чтобы люди могли проверить правильность ответа сервера.   -  person newbie    schedule 08.09.2011


Ответы (2)


Обновление (нечувствительный к регистру и довольно отказоустойчивый)


public static void main(String[] args) throws Exception {

    URI uri = URI.create("http://www.amerisourcebergendrug.com");

    Document d = Jsoup.connect(uri.toString()).get();

    for (Element refresh : d.select("html head meta[http-equiv=refresh]")) {

        Matcher m = Pattern.compile("(?si)\\d+;\\s*url=(.+)|\\d+")
                           .matcher(refresh.attr("content"));

        // find the first one that is valid
        if (m.matches()) {
            if (m.group(1) != null)
                d = Jsoup.connect(uri.resolve(m.group(1)).toString()).get();
            break;
        }
    }
}

Выводит правильно:

http://www.amerisourcebergendrug.com/abcdrug/

Старый ответ:

Вы уверены, что он не работает? Для меня:

System.out.println(Jsoup.connect("http://www.ibm.com").get().baseUri());

.. выводит http://www.ibm.com/us/en/ правильно..

person dacwe    schedule 08.09.2011
comment
извините, он работает для URL-адресов перенаправления, но не следует мета-URL-адресам обновления. Я обновил свой вопрос таким веб-сайтом - person Karthik; 08.09.2011
comment
Хорошо, jsoup, похоже, не работает с мета-перенаправлениями, я обновляю свой ответ некоторым кодом, который может обрабатывать такие перенаправления. - person dacwe; 08.09.2011
comment
Да, я знаю, что мы можем выбрать метатег и извлечь его, но я думал, что jsoup справится с этим автоматически, и теперь ясно, что он не справится. На самом деле спасибо, что разъяснили мне. - person Karthik; 09.09.2011
comment
Вы должны использовать .split("=", 2). В противном случае совпадение не удастся, если цель перенаправления содержит = (например, в строке запроса). - person Bob; 19.12.2014
comment
REFRESH также может быть записано как refresh. Таким образом, было бы безопаснее проверить наличие meta.attr("http-equiv").toUpperCase().contains("REFRESH") - person f_puras; 10.08.2015
comment
Спасибо, Боб и @f_puras. Обновлен этот ответ с нечувствительным к регистру обновлением и URL-адресом. Также обрабатывает ошибочные строки содержимого. - person dacwe; 12.08.2015
comment
@dacwe пробел между точкой с запятой не нужен и в некоторых случаях не работает, например, в следующем: <meta http-equiv="refresh" content="0;url=http://abstrusegoose.com/288"> - person alexgophermix; 18.01.2017

чтобы иметь лучшую обработку ошибок и проблему чувствительности к регистру

try
{
    Document doc = Jsoup.connect("http://www.ibm.com").get();
    Elements meta = doc.select("html head meta");
    if (meta != null)
    {
        String lvHttpEquiv = meta.attr("http-equiv");
        if (lvHttpEquiv != null && lvHttpEquiv.toLowerCase().contains("refresh"))
        {
            String lvContent = meta.attr("content");
            if (lvContent != null)
            {
                String[] lvContentArray = lvContent.split("=");
                if (lvContentArray.length > 1)
                    doc = Jsoup.connect(lvContentArray[1]).get();
            }
        }
    }

    // get page title
    return doc.title();

}
catch (IOException e)
{
    e.printStackTrace();
}
person DayDayHappy    schedule 18.08.2014