用于将相对URL修复为完整URL的asp.net逻辑

时间:2010-11-16 22:14:51

标签: asp.net url screen-scraping

我有一个从各种网络资源中提取网址的功能。不用说,有些是完整有效的URL,有些是相对于页面的HTML。下面是我的asp.net / c#logic我派生用于检查URL,然后从网站上抽取的数据生成一个完整的可用URL ...

我有一段时间没有看过这段代码,但我记得它在几个月前运行良好,现在需要进行许多调整才能运行 - 特别是相对路径和从各种相对变化中重新生成一个完整的URL。

有没有比我在这里看到的路由样板任务更简单的方法或方法?

注意: origianlurl是第一个搜索页面的完整网址,relativeUrl是在搜索到的页面中找到的网址(可以是完整的www.site.com或/contactus.html)

    private string ResolveRelativePaths(string relativeUrl, string originatingUrl)
    {
        if (relativeUrl.StartsWith("http") || relativeUrl.StartsWith("www"))
            return relativeUrl;

        if (relativeUrl.StartsWith("/"))
        {
            //get main url something.com
            Uri myURI = new Uri(originatingUrl);

            //add the relative page to the end
            return myURI.Host + relativeUrl;
        }

        string resolvedUrl = String.Empty;

        string[] relativeUrlArray = relativeUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        string[] originatingUrlElements = originatingUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        int indexOfFirstNonRelativePathElement = 0;
        for (int i = 0; i <= relativeUrlArray.Length - 1; i++)
        {
            if (relativeUrlArray[i] != "..")
            {
                indexOfFirstNonRelativePathElement = i;
                break;
            }
        }

        int countOfOriginatingUrlElementsToUse = originatingUrlElements.Length - indexOfFirstNonRelativePathElement - 1;
        //for (int i = 0; i <= countOfOriginatingUrlElementsToUse - 1; i++)
        for (int i = 0; i <= countOfOriginatingUrlElementsToUse ; i++)
        {
            if (originatingUrlElements[i] == "http:" || originatingUrlElements[i] == "https:")
                resolvedUrl += originatingUrlElements[i] + "//";
            else
                resolvedUrl += originatingUrlElements[i] + "/";
        }

        for (int i = 0; i <= relativeUrlArray.Length - 1; i++)
        {
            if (i >= indexOfFirstNonRelativePathElement)
            {
                resolvedUrl += relativeUrlArray[i];

                if (i < relativeUrlArray.Length - 1)
                    resolvedUrl += "/";
            }
        }

        return resolvedUrl;
    } 

1 个答案:

答案 0 :(得分:1)

Uri类有一个constructor,你可以准确地使用它。给定一个基础uri,即你的originatingUrl和一个字符串(相对部分),它会生成完整的url。据我所知,你的方法中没有一件事是使用Uri类(可能是几个实例)无法完成的。我的猜测是你可以把它重写为5-10 LOC。