2016-09-29 78 views
1

我试图从各个网站解析出导航链接。从相对URL转换为绝对URL不正确Android JSoup

我一直有与使用同./这里开头的相对格式中的一个特定部位的问题与相关PARAM值的代码片段中的注释:

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

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

回答

2

问题:

如果你看一下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")); 
+0

很好解释。不幸的是,我忘了给我的问题添加一个相关的信息 - 我没有使用Jsoup在这个实例中加载URL,只是解析出属性。因为这样的baseURI不是隐式设置的。除了使用选择器手动解析外,还有什么办法从这个文档(它包含完整的源文件)解析出baseURI? – alexgophermix

+0

@alexgophermix好吧,想知道,为什么你不得不打电话给setBaseUri。更新了我的答案:只是解析基本标签的头部并对其进行处理。出于好奇:你为什么不使用jsoup来获取页面/你在用什么? –

+1

我有一个异步网络任务,加载了各种回调和配置,并在整个应用程序的其他地方使用,不需要文件解析。可能还有改进的空间,但现在它正在工作中 – alexgophermix