【问题标题】:jsoup : Absolute path while working with filesjsoup :处理文件时的绝对路径
【发布时间】:2013-05-14 21:03:11
【问题描述】:

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

解决方案:link.get(i).baseUri + link.get(i).attr("href") 对我来说还不够,因为我需要了解如何识别哪个链接是相对的。

jsoup 文档告诉我们:

有一个姐妹方法 parse(File in, String charsetName) 它使用 文件的位置作为 baseUri。如果您正在工作,这很有用 在文件系统本地站点上,它指向的相对链接是 也在文件系统上。

但它在我的电脑上不起作用。

【问题讨论】:

    标签: java jsoup relative-path absolute-path


    【解决方案1】:

    我正在使用以下代码“解决”相同的问题。虽然我更喜欢在本地文件系统上运行的 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);
    

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

    <!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。我认为这超出了上述答案的范围,但我想我会提到我的发现。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,我之前试过(这个和link.get(i).attr("abs:href")一样,只是空字符串),但是没用。跨度>
      猜你喜欢
      • 2020-08-25
      • 2012-04-30
      • 2014-01-15
      • 1970-01-01
      • 2016-01-12
      • 2012-09-23
      • 2011-07-09
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多