2012-11-28 33 views
0
private void button1_Click(object sender, EventArgs e) 
    { 
     test(); 
    } 


    public void test() 
    { 

     Dictionary<string, string> LnksDict = new Dictionary<string, string>(); 

     using (SmartWebClient smwc = new SmartWebClient()) 
     { 

      HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
      htmlDoc.LoadHtml(smwc.DownloadString("http://www.google.com/adplanner/static/top1000/")); 
      var links = htmlDoc.DocumentNode 
          .Descendants("a").Select(x => x.Attributes["href"]); 
      foreach (var link in htmlDoc.DocumentNode.SelectNodes("//a")) 
      { 
       var UrlVal= link.Attributes["href"].Value; 
       var name = UrlVal.Split('.')[1]; 

       LnksDict.Add(name, UrlVal); 
      } 
     } 
    } 

#region <<=========== SmWbCl ============>> 

public class SmartWebClient : WebClient 
{ 
    private readonly int maxConcurentConnectionCount; 

    public SmartWebClient(int maxConcurentConnectionCount = 20) 
    { 

     this.maxConcurentConnectionCount = maxConcurentConnectionCount; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var httpWebRequest = (HttpWebRequest)base.GetWebRequest(address); 
     if (httpWebRequest == null) 
     { 
      return null; 
     } 

     if (maxConcurentConnectionCount != 0) 
     { 
      this.Proxy = null; 
      this.Encoding = Encoding.GetEncoding("UTF-8"); 
      httpWebRequest.ServicePoint.ConnectionLimit = maxConcurentConnectionCount; 
     } 

     return httpWebRequest; 
    } 

} 

#endregion 

在這段代碼中,我試圖構建一個列表,以便稍後用作自動完成源的URL。填充字典與鏈接通過HtmlAgility&自定義webclient

我做錯了什麼是notc onditioning添加到字典中的解析值。

我需要找到一個方法來添加域名爲重點,即使已經存在,

,所以我希望能夠做一個條件:

如果在這個字典中的key已經存在,加上目前linkcollection indexstring.valuekey作爲後綴

,或者如果你想提出一個不同的解決方案都在一起......我會很高興看到新的榜樣。 謝謝

回答

1

我想你想要什麼,而不是Dictionary<string, string>,是一個Dictionary<string, HashSet<string>>。這樣,您可以爲每個域建立一個URL列表。您的代碼將項目添加到列表是:

var UrlVal= link.Attributes["href"].Value; 
var name = UrlVal.Split('.')[1]; 

// get links for this host 
HashSet hostLinksList; 
if (!LnksDict.TryGetValue(name, out hostLinksList)) 
{ 
    hostLinksList = new HashSet<string>(); 
    LnksDict.Add(name, hostLinksList); 
} 
// add the URL to the list of links for this host 
hostLinksList.Add(UrlVal); 

這裏的關鍵是,在HashSet調用Add當項目已經存在不會拋出異常。它只是不會再添加它並返回false以指示該項目已在集合中。

完成後,您將看到每個主機(域)的URL列表,然後可以將其用於自動完成。

順便說一句,你使用Split('.')拆分主機的方法不能很好地工作。它假定形式爲「www.example.com」的域。例如,如果遇到「example.com」(不含「www」),則會爲該名稱獲取「com」。此外,「www.example.com」將與「www.example.org」和「www.example.co.uk」發生衝突。您需要更好的方式來識別主機。

+0

第一個爲什麼你不睡覺在這個小時(:我在這裏,只要我醒着..(第二,我看到,每一個新的簡單任務,我想達到的結果我突然有5個新對象研究(:('HashSet'),第三和最後我想感謝你一個非常好解釋的答案!!希望在你有時間在我的帖子中回答「花費」時見到你。 – LoneXcoder