[C#] Regex筆記- 找出所有的超連結+轉換相對路徑成絕對路徑
2012-12-01
之前發過一篇文章有關於透過Regular Expression 來抓取網頁中超連結的部分 參考網頁
但是會於遇到這樣的情形..
其中有很多相對路徑,如果要寫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 />"; }
}
結果:
這樣很多相對路徑都會被轉正確了…
請注意,當然這離真的在寫爬蟲程式還有許多要調校..
我測試過 tw.yahoo.com 還是會有些連結會有不正常現象…
但是對於大部分網站來說都已經可以應付了…
