【问题标题】:can jsoup handle meta refresh redirectjsoup 可以处理元刷新重定向吗
【发布时间】:2011-09-08 06:27:56
【问题描述】:

我在使用 jsoup 时遇到问题,我正在尝试从 url 中获取一个文档,该文档将基于不起作用的元刷新 url 重定向到另一个 url,以便清楚地解释我是否正在输入一个名为 @ 的网站 url 987654321@ 将根据元刷新 url 自动重定向到 http://www.amerisourcebergendrug.com/abcdrug/ 但我的 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();

但两者都不起作用

有什么解决方法吗?

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

【问题讨论】:

  • 服务器返回的重定向状态可能不正确。如果可以添加真实的url,那么人们可以测试服务器响应是否正确。

标签: java jsoup


【解决方案1】:

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


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

【讨论】:

  • 抱歉,它适用于重定向 URL,但不遵循元刷新 URL。我已经用这种网站更新了我的问题
  • 好的,jsoup 似乎不适用于元重定向,我用一些可以处理此类重定向的代码更新我的答案。
  • 是的,我知道我们可以选择元标记并提取,但我认为 jsoup 会自动处理这个问题,现在很明显它不会处理。非常感谢您让我清楚。
  • 你应该使用.split("=", 2)。否则,如果重定向目标包含=(例如在查询字符串中),则匹配将失败。
  • 感谢 Bob 和@f_puras。使用不区分大小写的刷新和 url 更新了这个答案。还处理错误的内容字符串。
【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2011-01-11
    • 2014-05-19
    • 2017-06-23
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多