2013-05-14 45 views
0

我得到了一些帶有html文件的頁面存儲庫。我想用jsoup來處理它們,但是當我嘗試獲得所有鏈接的絕對路徑時,jsoup給了我空字符串(「」)。是否有可能將baseUri設置爲文件路徑?解決方法:link.get(i).baseUri + link.get(i).attr(「href」)對我來說是不夠的,因爲我需要一些如何識別哪個鏈接是相對或不相關的。jsoup:使用文件時的絕對路徑

的jsoup文件說我們:

有一個妹妹方法解析(文件中,字符串的charsetName),它採用的基本URI文件的位置。如果您正在處理文件系統本地站點並且它指向的相關鏈接也位於文件系統上,這非常有用。

但它不起作用在我的電腦上。

回答

0

您可以在JSoup Elements中使用absUrl()函數。

String path = linkEl.absUrl("href"); 
+0

是的,我以前試過(這與link.get(i).attr(「abs:href」)一樣,只有空字符串),但它沒有奏效。 – user2381490

0

我用下面的代碼「解決」同樣的問題。雖然我更喜歡jsoup函數在我的本地文件系統上工作,但我同時需要一些東西。該解決方案將文件位置作爲baseURI發送到解析器,然後將每個相對路徑連接到該基礎。不幸的是,這意味着我失去了jsoup通常使用其內置函數處理的HTML的「../」的嵌套功能。而且,我不能肯定內置函數的效果。

幸運的是,我主要使用它來進行JUnit測試,它會給我的生產代碼增加很小的風險。上下文是我建立了一個本地「互聯網」來測試離線爬行。我在我的JUnit測試類發送本地HTML文件,它創建JSoup文件:

// From my JUnit Test 
String testFileName = "HTMLTest_RelativeReferences.html"; 
String testFilePath = getClass().getResource(testFileName).getPath(); 
String testFileBaseURI = testFilePath.replace(testFileName, ""); 

// ... 
// Sends filePath and baseURI to testing class that creates JSoup Doc with: 
siteDoc = Jsoup.parse(new File(testFilePath), "UTF-8", testFileBaseURI); 

現在,我創造了我的文檔具有基本URI,你&我都認爲相對路徑,應使用基本URI創建絕對路徑。由於失敗,我運行了一個簡單的空字符串abs測試:refs並連接我自己的URL。

Elements links = siteDoc.select("a[href]"); // extract link collection 
for (Element link : links) { // iterate through links 
    String linkString = link.attr("abs:href"); // ftr, neither this nor absUrl("href") works 
    if (linkString.isEmpty()) { // check if returned "" (i.e., the problem at hand) 
     URLs.add(siteDoc.baseUri() + link.attr("href")); // concatenate baseURI to relative ref 
    } 
    else { // for all the properly returned absolute refs 
     URLs.add(link.attr("abs:href")); 
    } 
} 

我所有的JUnit測試都繼續通過絕對和相對本地引用 - 祝你好運!

HTML文件我用與代表在同一​​文件夾以外的HTML文件中的所有3個鏈接參考:

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<title>HTML Test using Relative References</title> 
 
</head> 
 
<body> 
 
\t <a href="LinkedHTMLFile1.html">Link1</a> 
 
\t <a href="LinkedHTMLFile2.html">Link2</a> 
 
\t <a href="LinkedHTMLFile3.html">Link3</a> 
 
</body> 
 
</html>

編輯:我的小挖入jsoup庫使我相信,我們的本地文件「 URL將永遠不會工作,因爲jsoup在其attr(「abs:href」)過程中處理實際的URL,並且將通過MalformedURLs並返回「」,因爲我們實際上使用本地文件路徑而不是真正的URL。我認爲這超出了上述答案的範圍,但我想我會提及我的發現。