上次已经可以得到页面的HTML代码了,接下来需要对HTML代码分析,得到里面所有的链接和过滤掉没用的HTML代码,把文字内容保留下来。
分析HTML代码,通过正规表达式将链接和链接的文字内容保存下来。
private void FindLink(string html)
{
this.TextBox3.Text="";
List<string> hrefList = new List<string>();//链接
List<string> nameList = new List<string>();//链接名称
string pattern = @"<a\s*href=(""|')(?<href>[\s\S.]*?)(""|').*?>\s*(?<name>[\s\S.]*?)</a>";
MatchCollection mc = Regex.Matches(html, pattern);
foreach (Match m in mc)
{
if (m.Success)
{
//加入集合数组
hrefList.Add(m.Groups["href"].Value);
nameList.Add(m.Groups["name"].Value);
this.TextBox3.Text += m.Groups["href"].Value + "|" + m.Groups["name"].Value + "\n";
}
}
}
这个方法只实现简单的找到链接,并没有过滤掉#或javascript:void(0)这样的内容。
接下要过滤掉没有用的HTML代码,保留文字内容,基本还是正规表达式,网上还有很多种方法,写的正规的HTML页面都可以正常过滤掉,不过对于那些代码都不成对的、不按常理出牌的网站,我就很无语了……
public string ClearHtml(string text)//过滤html,js,css代码
{
text = text.Trim();
if (string.IsNullOrEmpty(text))
return string.Empty;
text = Regex.Replace(text, "<head[^>]*>(?:.|[\r\n])*?</head>", "");
text = Regex.Replace(text, "<script[^>]*>(?:.|[\r\n])*?</script>", "");
text = Regex.Replace(text, "<style[^>]*>(?:.|[\r\n])*?</style>", "");
text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", ""); //<br>
text = Regex.Replace(text, "\\&[a-zA-Z]{1,10};", "");
text = Regex.Replace(text, "<[^>]*>", "");
text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", ""); //
text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //其它任何标记
text = Regex.Replace(text, "[\\s]{2,}", " "); //两个或多个空格替换为一个
text = text.Replace("'", "''");
text = text.Replace("\r\n", "");
text = text.Replace(" ", "");
text = text.Replace("\t", "");
return text.Trim();
}
最后再加个通过URL分析IP地址的方法,有些域名做均衡负载的都可以分析出多个IP,不过只能在本地运行,放IIS上需要完整的信任级别,关于信任级别的说明请点这里。
private void IPAddresses(string url)
{
url = url.Substring(url.IndexOf("//") + 2);
if (url.IndexOf("/") != -1)
{
url = url.Remove(url.IndexOf("/"));
}
this.Literal1.Text += "<br>" + url;
try
{
System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();
IPHostEntry ipHostEntry = Dns.GetHostEntry(url);
System.Net.IPAddress[] ipaddress = ipHostEntry.AddressList;
foreach (IPAddress item in ipaddress)
{
this.Literal1.Text += "<br>IP:" + item;
}
}
catch { }
}