我正在尝试解析来自各个站点的导航链接。
我遇到了一个特定站点的问题,该站点使用以开头的相对格式。./
这是注释中带有相关参数值的代码段:
// 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?
问题:
如果您查看html源代码的标题,则会发现:
<head>
...
<base href="http://megatokyo.com/" />
</head>
这是什么意思?
对于文档中的所有相对URL,它将用作基础(因此这是当前目录./
)。请参阅:http://www.w3schools.com/tags/tag_base.asp
使固定:
Jsoup已准备就绪,可以检测到该<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"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句