[C#] Regex筆記- 取得網頁META 紀錄的內容
2012-11-02
又到了Regex 時間,因為寫Regex 方法百百種,所以有碰到就紀錄一下,
今天遇到的問題,就是如何知道這網頁內容是啥東西,當然我可以用這招..Regex筆記- 移除所有HTML tag + 移除 JavaScript
但是這內容很多,所以我決定從網頁META 內容下手,如果沒有再去取<TITLE> 裡面的資料,在沒有真的去抓CONTENT
但是現在越來越多人會去寫META 了 ..
通常網頁來說 META 會長這樣..
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="discription" content="當麻許Silverlight學習筆記" />
<meta name="keywords" content="六月羊,當麻許,Silverlight,D小調,C#" />
<meta name="keywords" content="C#,ASP.net,Regex" />
<meta name="author" content="當麻許" />
<meta name="description" content="最近公司需求,需要parse 一些資料,就趁這機會筆記一下..需求是找出網頁中,所有的超連結位置.." />
所以name 跟 content 這屬性是我要的..
這時候就乾脆寫一function 將所有的meta 都掃過一次 變成Key Value 型態作運用..
如何使用:
/// <summary>
/// 取得Meta 中的 name 跟 content ,分別轉換成Key Value
/// </summary>
/// <param name="htmlSource"></param>
/// <returns></returns>
public static KeyValuePair<string, string>[] GetLinkMetaDataKeyValue(string htmlSource)
{
IDictionary<string, string> res = new Dictionary<string, string>();
var regex = new Regex(
@"<meta[\s]+[^>]*?name[\s]?=[\s""']+(?<KEY>.*?)[\s""']+content[\s]?=[\s""']+(?<VALUE>.*?)[""']+.*?>",
RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(htmlSource);
foreach (Match match in matches)
{
var tmp="";
//有些網站會有重複現象,所以如果發現,就累加至同一個Key Value
if (!res.TryGetValue(match.Groups["KEY"].Value,out tmp))
{
res.Add(new KeyValuePair<string, string>(match.Groups["KEY"].Value, match.Groups["VALUE"].Value));
}else
{
res[match.Groups["KEY"].Value] += "," + match.Groups["VALUE"].Value;
}
}
return res.ToArray();
}
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");
client.Encoding = System.Text.Encoding.UTF8;
var source = client.DownloadString("http://www.dotblogs.com.tw/junegoat/archive/2012/08/26/c-sharp-regex-remove-all-html-tag.aspx");
foreach (var str in GetLinkMetaDataKeyValue(source))
{
ltlResult.Text += str.Key + "," + str.Value + "<br />";
}
結果:
給有需要的人..