gpt4 book ai didi

java - 从相对 URL Android JSoup 转换时绝对 URL 不正确

转载 作者:行者123 更新时间:2023-11-29 19:31:55 26 4
gpt4 key购买 nike

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

我在使用以 ./ 为前缀的相对格式的某个特定站点时遇到了问题,这是在注释中包含相关参数值的代码 fragment :

// 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/),这意味着 anchor 在网站上做错了。然而,Chrome、Firefox 和 IE 都将相对 URL 解析为指向下一个 fragment 而不是 /strip/strip/1457。在其他情况下,有什么方法可以纠正这种行为而不破坏相对 URL?

最佳答案

问题:

如果您查看 html 源代码的标题,您会发现:

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

这是什么意思?

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

修复:

Jsoup allready 检测到 <base> 标签并且 ele.absUrl("href") 会(并且确实,刚刚测试过)返回 http://megatokyo.com/strip/1457 但您正在使用 ele.setBaseUri(url); 覆盖正确的设置,因此删除这行代码。

如果您想自己处理设置正确的基数,只需解析 <base> 元素的头部:

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"));

关于java - 从相对 URL Android JSoup 转换时绝对 URL 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39778581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com