【问题标题】:What is the best way with dealing with internal links while scraping抓取时处理内部链接的最佳方法是什么
【发布时间】:2013-05-26 17:06:24
【问题描述】:

我正在用 C# 构建一个网络爬虫,并通过执行以下操作获取页面上的所有链接:

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))

}

这是在 Internet 上运行的,因此链接可能格式不正确,甚至可能是不同的协议。将 /gohere/index.html 或 potato.php 等内部链接转换为也包含网站 URL 的外部链接的最佳方法是什么。

【问题讨论】:

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


    【解决方案1】:

    这可以很容易地完成,您可以使用您用于获取页面的 Uri 构造一个新的 Uri。

    像这样:

    Uri baseUri = new Uri("http://www.contoso.com");
    Uri myUri = new Uri(baseUri, "catalog/shownew.htm");
    
    Console.WriteLine(myUri.ToString());
    

    欲了解更多信息:http://msdn.microsoft.com/en-us/library/9hst1w91.aspx

    这适用于相对和绝对href的类似,因此无需检查,您只需“转换”在此类页面上找到的每个链接。

    【讨论】:

    • 一个问题,当在同一页面中找到外部链接时会发生什么?
    【解决方案2】:

    我对“这是在 Internet 上运行”部分感到困惑。您是先下载网页然后再抓取它吗? 另外,如果语言不依赖,我建议使用 jSoup。它将回答您的大部分问题。

    【讨论】:

    • 我正在下载并解析页面上的所有链接,一些链接是内部的,一些是外部的。
    【解决方案3】:

    虽然shriek的答案是对的,但我更喜欢简单的方法:

    List<string> links = new List<string>();
    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
        links.Add("http://mywebsite.com"+link.InnerText);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2010-09-06
      • 2018-07-24
      • 2018-12-25
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多