[C#] Regex筆記- 找出所有的超連結+轉換相對路徑成絕對路徑

2012-12-01

 

之前發過一篇文章有關於透過Regular Expression 來抓取網頁中超連結的部分 參考網頁

但是會於遇到這樣的情形..

2012-08-27_211035_thumb

 

其中有很多相對路徑,如果要寫spider 的話這樣很難換算..

這時候有一種方法可以偷吃步的 將相對路徑轉成絕對路徑

就是利用 Uri.TryCreate 的方法..

/// <summary>
/// 將可能為相對路徑轉成絕對路徑
/// </summary>
/// <param name="baseURL">網站</param>
/// <param name="checkURL">相對路徑/絕對路徑</param>
/// <returns></returns>
string  ConvertToAbsoluteURL(string baseURL,string checkURL)
{
    Uri result;
    var res = Uri.TryCreate(new Uri(baseURL, UriKind.Absolute), new Uri(checkURL, UriKind.RelativeOrAbsolute), out  result); 
    if(res)
    {
        return result.AbsoluteUri; 
    }else
    {
        return checkURL; 
    }
 
 
}
 
 
/// <summary>
/// 輸入網址原始碼,透過refex 將所有網址找出來
/// </summary>
/// <returns> 所有抓取到的網址 </returns>
public static string[] GetLinkUrlsFromPath(string htmlSource)
{
    List<string> res = new List<string>();
    var regex = new Regex(
        @"(?:href\s*=)(?:[\s""']*)(?!#|mailto|location.|javascript)(?<PARAM1>.*?)(?:[\s>""'])",
        RegexOptions.IgnoreCase);
    MatchCollection matches = regex.Matches(htmlSource);
 
    foreach (Match match in matches)
    {
        //將href=" 濾掉
        // res.Add(match.Groups[0].Value.Substring(6, match.Groups[0].Value.Length-7));
        res.Add(match.Groups["PARAM1"].Value);
 
    }
 
    return res.ToArray();
}
 
/// <summary>
/// 從網路上取得原始碼
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetSourceFromUrl(string url)
{
 
    WebClient client = new WebClient();
 
    //以防萬一 模擬自己為瀏覽器
    client.Headers.Add("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5");
    client.Headers.Add("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    client.Headers.Add("Accept-Encoding: identity");
    client.Headers.Add("Accept-Language: zh-TW,en;q=0.8");
    client.Headers.Add("Accept-Charset: utf-8;q=0.7,*;q=0.3");
    client.Headers.Add("ContentType", "application/x-www-form-urlencoded");
    return client.DownloadString(url);
}

 


使用時候..


 



protected void btnTest_Click(object sender, EventArgs e)
{
  ltlResult.Text = "";
  foreach (var str in GetLinkUrlsFromPath(GetSourceFromUrl(txtLink.Text)))
  {
      ltlResult.Text += "<a href='" + ConvertToAbsoluteURL(txtLink.Text, str) + "' >" + ConvertToAbsoluteURL(txtLink.Text, str) + "</a><br />";    
     // ltlResult.Text += "<a href='" +str+ "' >" +str + "</a><br />";    
  }
}

 


 


結果:


 


2012-08-27_211100_thumb


這樣很多相對路徑都會被轉正確了…


請注意,當然這離真的在寫爬蟲程式還有許多要調校..


我測試過 tw.yahoo.com 還是會有些連結會有不正常現象…


但是對於大部分網站來說都已經可以應付了…


當麻許的超技八 2014 | Donma Hsu Design.