2016-09-29 73 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