可以jsoup处理元刷新重定向

时间:2011-09-08 06:27:57

标签: java jsoup

我有一个问题,使用jsoup,我想要做的是从网址获取一个文件,它将重定向到另一个网址,基于元刷新网址无法正常工作,清楚地解释我是否输入了一个名为{的网站网址{3}}会自动重定向到http://www.amerisourcebergendrug.com,具体取决于元刷新网址,但我的jsoup仍然坚持使用http://www.amerisourcebergendrug.com/abcdrug/而不是重定向并从http://www.amerisourcebergendrug.com获取

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

我也试过用,

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

但两者都不起作用

对此有何解决方法?

更新 页面可以使用元刷新重定向方法

2 个答案:

答案 0 :(得分:13)

更新(不区分大小写且容错的容错)


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/ ..

答案 1 :(得分:2)

有更好的错误处理和区分大小写问题

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();
}