我用下面的代碼「解決」同樣的問題。雖然我更喜歡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。我認爲這超出了上述答案的範圍,但我想我會提及我的發現。
是的,我以前試過(這與link.get(i).attr(「abs:href」)一樣,只有空字符串),但它沒有奏效。 – user2381490