jsoup:处理文件时的绝对路径

时间:2013-05-14 21:03:12

标签: java jsoup relative absolute

我有一些带有html文件的页面存储库。我想用jsoup处理它们,但当我尝试获取所有链接的absoloute路径时,jsoup给了我空字符串(“”)。是否有可能将baseUri设置为文件路径?

解决方案:link.get(i).baseUri + link.get(i).attr(“href”)对我来说还不够,因为我需要知道哪些链接是相对的。

jsoup文档告诉我们:

有一个姐妹方法解析(File in,String charsetName),它使用文件的位置作为baseUri。如果您正在处理文件系统本地站点并且它指向的相对链接也在文件系统上,这将非常有用。

但它在我的电脑上无效。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我正在使用以下代码“解决”同样的问题。虽然我更喜欢在本地文件系统上运行的jsoup函数,但在此期间我需要一些东西。该解决方案是将文件位置作为baseURI发送到解析器,然后将每个相对路径连接到该基础。不幸的是,这意味着我失去了jsoup通常使用其内置函数处理的HTML“../”的嵌套功能。此外,我无法确定结果,就像内置函数一样有效。

幸运的是,我主要用于JUnit测试,它应该为我的生产代码增加小风险。上下文是我构建了一个本地“Internet”来测试离线爬行。我通过在JUnit Test Class中向它发送一个本地HTML文件来创建JSoup Document:

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

现在我用baseURI创建了我的文档,你和&我都认为相对路径应该使用该baseURI来创建绝对路径。由于失败了,我对空字符串abs执行一个简单的测试:引用并连接我自己的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 Doc我用来参考同一文件夹中代表其他HTML文件的所有3个链接:

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

编辑:我很少深入jsoup库让我相信我们的本地文件“URL”将永远无法工作,因为jsoup在其attr(“abs:href”)过程中处理实际的URL并将通过MalformedURLs并返回“”因为我们实际上使用的是本地文件路径而不是真正的URL。我认为这超出了上述答案的范围,但我想我会提到我的发现。