抓取和分析網頁的類。
主要功能有:
1、提取網頁的純文本,去所有html標簽和javascript代碼
2、提取網頁的鏈接,包括href和frame及iframe
3、提取網頁的title等(其它的標簽可依此類推,正則是一樣的)
4、可以實現簡單的表單提交及cookie保存
/*
* Author:Sunjoy at CCNU
* 如果您改進了這個類請發一份代碼給我(ccnusjy 在gmail.com)
*/
using System;
using System.Data;
using System.Configuration;
using System.Net;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;
/// <summary>
/// 網頁類
/// </summary>
public class WebPage
{
#region 私有成員
private Uri m_uri; //網址
private List<Link> m_links; //此網頁上的鏈接
private string m_title; //此網頁的標題
private string m_html; //此網頁的HTML代碼
private string m_outstr; //此網頁可輸出的純文本
private bool m_good; //此網頁是否可用
private int m_pagesize; //此網頁的大小
private static Dictionary<string, CookieContainer> webcookies = new Dictionary<string, CookieContainer>();//存放所有網頁的Cookie
private string m_post; //此網頁的登陸頁需要的POST數據
private string m_loginurl; //此網頁的登陸頁
#endregion
#region 私有方法
/// <summary>
/// 這私有方法從網頁的HTML代碼中分析出鏈接信息
/// </summary>
/// <returns>List<Link></returns>
private List<Link> getLinks()
{
if (m_links.Count == 0)
{
Regex[] regex = new Regex[2];
regex[0] = new Regex("(?m)<a[^><]+href=("|)?(?<url>([^>"\s)])+)("|)?[^>]*>(?<text>(\w|\W)*?)</", RegexOptions.Multiline | RegexOptions.IgnoreCase);
regex[1] = new Regex("<[i]*frame[^><]+src=("|)?(?<url>([^>"\s)])+)("|)?[^>]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
for (int i = 0; i < 2; i++)
{
Match match = regex[i].Match(m_html);
while (match.Success)
{
try
{
string url = new Uri(m_uri, match.Groups["url"].Value).AbsoluteUri;
string text = "";
if (i == 0) text = new Regex("(<[^>]+>)|(\s)|( )|&|"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");
Link link = new Link(url, text);
m_links.Add(link);
}
catch(Exception ex){Console.WriteLine(ex.Message); };
match = match.NextMatch();
}
}
}
return m_links;
}
/// <summary>
/// 此私有方法從一段HTML文本中提取出一定字數的純文本
/// </summary>
/// <param name="instr">HTML代碼</param>
/// <param name="firstN">提取從頭數多少個字</param>
/// <param name="withLink">是否要鏈接裡面的字</param>
/// <returns>純文本</re