【问题标题】:Absolute URL incorrect when converted from relative URL Android JSoup从相对 URL Android JSoup 转换时绝对 URL 不正确
【发布时间】:2016-09-29 19:33:15
【问题描述】:

我正在尝试解析来自各个站点的导航链接。

我在使用前缀为 ./ 的相对格式的某个特定站点上遇到问题,这是代码 sn-p 与 cmets 中的相关参数值:

// url = http://megatokyo.com/strip/1456
// selector = ".next a"
// ele = <a href="./strip/1457">Next</a>
// attr = "href"
Element ele = doc.select(selector).get(index);
ele.setBaseUri(url);
String absoluteUrl = ele.absUrl(attr).trim().replaceAll("\n", "");

Jsoup 返回:

http://megatokyo.com/strip/strip/1457

实际上真正的链接是:

http://megatokyo.com/strip/1457

据我了解,Jsoup 在这里给出了正确的链接,因为 ./ 指的是当前目录 (http://megatokyo.com/strip/),这意味着锚在网站上的操作不正确。然而 Chrome、Firefox 和 IE 都将相对 URL 解析为指向下一条而不是 /strip/strip/1457。在其他情况下,有什么方法可以在不破坏相对 URL 的情况下纠正这种行为?

【问题讨论】:

    标签: java android jsoup


    【解决方案1】:

    问题:

    如果你看一下 html 源码的头部,你会发现:

    <head>
        ...
        <base href="http://megatokyo.com/" />
    </head>
    

    什么意思?

    对于文档中的所有相对 url,这将用作基础(因此这是当前目录./)。见:http://www.w3schools.com/tags/tag_base.asp

    修复:

    Jsoup 已经检测到 &lt;base&gt; 标记,而 ele.absUrl("href") 将(并且确实,只是测试过)返回 http://megatokyo.com/strip/1457,但您正在使用 ele.setBaseUri(url); 覆盖正确的设置,因此请删除这行代码。

    如果您想自己处理设置正确的基数,只需将头部解析为 &lt;base&gt; 元素:

    String url = "http://megatokyo.com/strip/1456";
    
    Element base = doc.select("head > base[href]").first();
    
    String baseUrl = base!=null ? base.attr("href") : url;
    
    Element ele = doc.select("#comic > div > div.navcontrols.top > ul > li.next > a").first();
    ele.setBaseUri(baseUrl);
    
    System.out.println(ele.attr("abs:href"));
    

    【讨论】:

    • 解释得很好。不幸的是,我忘记在我的问题中添加一条相关信息——在这种情况下,我没有使用 Jsoup 加载 URL,只是为了解析属性。因此 baseURI 没有被隐式设置。除了使用选择器手动解析之外,还有什么方法可以从本文档(包含完整源代码)中解析出 baseURI?
    • @alexgophermix 好的,我想知道为什么你必须调用 setBaseUri。更新了我的答案:只需解析基本标签的头部并处理它。出于好奇:你为什么不使用 jsoup 来获取页面/你在使用什么?
    • 我有一个异步网络任务,它加载了各种回调和配置,并在整个应用程序中不需要文档解析的其他地方使用。可能还有改进的余地,但它现在正在工作¯_(ツ)_/¯
    猜你喜欢
    • 2014-12-12
    • 2021-07-28
    • 2011-10-24
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多