【问题标题】:html agility pack url scraping-- getting full html linkhtml 敏捷包 url 抓取——获取完整的 html 链接
【发布时间】:2016-01-03 23:20:24
【问题描述】:

您好,我正在使用 nuget 包中的 html 敏捷包来抓取网页以获取页面上的所有 url。代码如下所示。然而,它在输出中返回给我的方式只是实际网站的扩展,而不是像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();
    }

【问题讨论】:

  • 仅供参考:ParseLinks 函数中变量名“email”的选择使得这无缘无故地令人困惑。结果,如果您在没有上下文的情况下阅读 erikscandola 的答案,那是没有意义的(附加带有 URL 的电子邮件 - 什么?)

标签: c# url web-scraping web-crawler html-agility-pack


【解决方案1】:

您可以检查 HREF 值是相对 URL 还是绝对 URL。 将链接加载到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 转换为绝对 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();
}

【讨论】:

    【解决方案2】:

    您无法获取完整的 url,因为在 href 属性中没有完整的 url。示例:&lt;a href="/foobar"&gt;&lt;/a&gt; 在您的情况下,该页面包含相对网址。你需要这样做:

    string href = email + n.Attributes["href"].Value;
    

    通过这种方式,您将获得完整的网址。更好的解决方案是检查url是相对的还是绝对的,如果是相对的,则在url的开头添加email,否则不添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多