【问题标题】:How can I get relative path from absolute http paths in Java如何从 Java 中的绝对 http 路径获取相对路径
【发布时间】:2023-03-31 23:37:01
【问题描述】:

我正在尝试用 Java 构建一个 Web Crawler,我想知道是否有任何方法可以从给定基本 url 的绝对路径中获取相对路径。我正在尝试替换同一域下 html 中的任何绝对路径。

由于 http url 包含不安全的字符,我无法使用 How to construct a relative path in Java from two absolute paths (or URLs)? 中描述的 Java URI。

我正在使用 jsoup 来解析我的 html,它似乎能够从相对路径获取绝对路径,但反之则不行。

例如 在以下html的特定html中,

"http://www.example.com/mysite/base.html"

在base.html的页面源码中,可以包含:

'<a href="http://www.example.com/myanothersite/new.html"> Another site of mine </a>

我正在尝试缓存这个 base.html,并对其进行编辑,使其现在包含:

'<a href="../myanothersite/new.html">Another site of mine</a>

【问题讨论】:

标签: java url web-crawler jsoup


【解决方案1】:

一种不同的方法,不需要给定的 baseUrl 并使用更高级的方法。

    String sourceUrl = "http://www.example.com/mysite/whatever/somefolder/bar/unsecure!+?#whätyöühäv€it/site.html"; // your current site
    String targetUrl = "http://www.example.com/mysite/whatever/otherfolder/other.html"; // the link target
    String expectedTarget = "../../../otherfolder/other.html";
    String[] sourceElements = sourceUrl.split("/");
    String[] targetElements = targetUrl.split("/"); // keep in mind that the arrays are of different length!
    StringBuilder uniquePart = new StringBuilder();
    StringBuilder relativePart = new StringBuilder();
    boolean stillSame = true;
    for(int ii = 0; ii < sourceElements.length || ii < targetElements.length; ii++) {
        if(ii < targetElements.length && ii < sourceElements.length && 
                stillSame && sourceElements[ii].equals(targetElements[ii]) && stillSame) continue;
        stillSame = false;
        if(targetElements.length > ii)
          uniquePart.append("/").append(targetElements[ii]);
        if(sourceElements.length > ii +1)
            relativePart.append("../");
    }

    String result = relativePart.toString().substring(0, relativePart.length() -1) + uniquePart.toString();
    System.out.println("result: " + result);

【讨论】:

    【解决方案2】:

    应该这样做。请记住,您可以通过测量源 URL 和目标 URL 的相同程度来计算 baseUrl!

        String baseUrl = "http://www.example.com/mysite/whatever/"; // the base of your site
        String sourceUrl = "http://www.example.com/mysite/whatever/somefolder/bar/unsecure!+?#whätyöühäv€it/site.html"; // your current site
        String targetUrl = "http://www.example.com/mysite/whatever/otherfolder/other.html"; // the link target
        String expectedTarget = "../../../otherfolder/other.html";
        // cut away the base.
        if(sourceUrl.startsWith(baseUrl))
            sourceUrl = sourceUrl.substring(baseUrl.length());
        if(!sourceUrl.startsWith("/"))
            sourceUrl = "/" + sourceUrl;
    
        // construct the relative levels up
        StringBuilder bar = new StringBuilder();
        while(sourceUrl.startsWith("/"))
        {
            if(sourceUrl.indexOf("/", 1) > 0) {
                bar.append("../");
                sourceUrl = sourceUrl.substring(sourceUrl.indexOf("/", 1));
            } else {
                break;
            }
            System.out.println("foo: " + sourceUrl);
        }
    
        // add the unique part of the target
        targetUrl = targetUrl.substring(baseUrl.length());
        bar.append(targetUrl);
    
        System.out.println("expectation: " + expectedTarget.equals(bar.toString()));
        System.out.println("bar: " + bar);
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 2022-06-10
      • 2011-02-07
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多