html 민첩성 팩 URL을 근근이 살아가고 - 전체 HTML 링크를 받고

c# html-agility-pack url web-crawler web-scraping

문제

안녕하세요, 페이지의 URL을 모두 얻으려면 웹 페이지를 긁어 내기 위해 nuget 패키지에서 html 민첩성 팩을 사용하고 있습니다. 코드는 아래와 같습니다. 그러나 그것이 출력에 내게로 돌아 오는 방식은 링크는 실제 웹 사이트의 확장 일뿐 http://www.foo/bar/foobar.com 과 같은 전체 URL 링크는 아닙니다. 내가 얻을 수있는 것은 "/ foobar"입니다. 아래 코드를 사용하여 URL의 전체 링크를 얻을 수있는 방법이 있습니까? 감사!

static void Main(string[] args)
    {
        List<string> linksToVisit = ParseLinks("https://www.facebook.com");
    }

public static List<string> ParseLinks(string email)
    {

        WebClient webClient = new WebClient();

        byte[] data = webClient.DownloadData(email);
        string download = Encoding.ASCII.GetString(data);

        HashSet<string> list = new HashSet<string>();

        var doc = new HtmlDocument();
        doc.LoadHtml(download);
        HtmlNodeCollection nodes =    doc.DocumentNode.SelectNodes("//a[@href]");

            foreach (var n in nodes)
            {
                string href = n.Attributes["href"].Value;
                list.Add(href);
            }
        return list.ToList();
    }

인기 답변

상대 URL 또는 절대 값 인 경우 HREF 값을 확인할 수 있습니다. 링크를 Uri에 로드하고 상대 경로인지 테스트합니다. 상대 경로를 절대 경로로 변환하면 이동하는 방법이됩니다.

static void Main(string[] args)
    {
        List<string> linksToVisit = ParseLinks("https://www.facebook.com");
    }

public static List<string> ParseLinks(string urlToCrawl)
    {

        WebClient webClient = new WebClient();

        byte[] data = webClient.DownloadData(urlToCrawl);
        string download = Encoding.ASCII.GetString(data);

        HashSet<string> list = new HashSet<string>();

        var doc = new HtmlDocument();
        doc.LoadHtml(download);
        HtmlNodeCollection nodes =    doc.DocumentNode.SelectNodes("//a[@href]");

            foreach (var n in nodes)
            {
                string href = n.Attributes["href"].Value;
                list.Add(GetAbsoluteUrlString(urlToCrawl, href));
            }
        return list.ToList();
    }

상대 URL을 절대로 변환하는 기능

static string GetAbsoluteUrlString(string baseUrl, string url)
{
    var uri = new Uri(url, UriKind.RelativeOrAbsolute);
    if (!uri.IsAbsoluteUri)
        uri = new Uri(new Uri(baseUrl), uri);
    return uri.ToString();
}


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.