[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 還是會有些連結會有不正常現象…
但是對於大部分網站來說都已經可以應付了…