www.pudn.com > Crawler_bemjh.rar > HtmlParser.cs


using System; 
using System.Collections; 
using System.Text; 
 
namespace CrawlerLib 
{ 
	///  
	/// 锚结构体 
	///  
	public struct Anchor 
	{ 
		public string AnchorUri; 
		public string AnchorText; 
	} 
	///  
	/// HTML文本结构体 
	///  
	public struct HtmlText 
	{ 
		public string TagName; 
		public string Text; 
	} 
	///  
	/// pretreament 的摘要说明。 
	///  
	public class HtmlParser 
	{ 
		//HTML解析器 
		private ParseHTML m_parser; 
		//tag列表 
		private ArrayList m_Tags; 
 
		//URL的总条数 
		private int urlCount; 
		///  
		/// 构造函数,参数为HTML源文本 
		///  
		/// 被解析的文本 
		public HtmlParser(string source) 
		{ 
			//生成HTML解析器实例 
			m_parser = new ParseHTML(); 
			m_parser.Source = source; 
			//解析HTML 
			m_Tags = m_parser.Parsing(); 
		} 
		///  
		/// 获取Html内的所有标记,返回一个Tag型的列表 
		///  
		///  
		public ArrayList GetTags() 
		{ 
			return m_Tags; 
		} 
 
		///  
		/// 获取URL的总条数 
		///  
		///  
		public int GetURLsCount() 
		{ 
			urlCount = 0; 
			foreach(Anchor myAnchor in GetURLs()) 
			{ 
				urlCount++; 
			} 
			return urlCount; 
		}		 
		 
		///  
		/// 获取网页中的URL及锚文本,结果是Anchor型列表集合 
		///  
		/// Anchor列表 
		///  
		public ArrayList GetURLs() 
		{ 
			ArrayList urls = new ArrayList(); 
			// 
			Anchor anchor = new Anchor(); 
			bool isAnchor =false;//发现链接标记 
			 
			//遍历各标记 
			foreach( Tag tag in m_Tags ) 
			{ 
				if(tag.TagName == "A") 
				{ 
					//遍历属性集合,查找HREF 
					foreach( Attribute a in tag.TagAttributes ) 
					{ 
						if( a.Name == "HREF" ) 
							anchor.AnchorUri = a.Value; 
					} 
					isAnchor = true; 
				} 
				//发现/A标记,且HREF不是#,则将链接添加到URL列表中 
				if(tag.TagName == "/A" && anchor.AnchorUri != "#") 
				{ 
					urls.Add( anchor ); 
					isAnchor = false; 
					anchor = new Anchor(); 
				} 
				if( isAnchor ) 
				{ 
					anchor.AnchorText += tag.FollowedText; 
				} 
			} 
			return urls; 
		} 
		///  
		/// 获取网页Keywords,返回的关键词字符串用空格隔开 
		///  
		///  
		public string GetKeywords() 
		{ 
			string keywords=""; 
			foreach(Tag tag in m_Tags) 
			{ 
				if(tag.TagName=="META") 
				{ 
					foreach(Attribute a in tag.TagAttributes) 
					{ 
						if(a.Name=="KEYWORD") 
							keywords+=a.Value+" "; 
					} 
				} 
				if(tag.TagName=="BODY") 
					break; 
			} 
			return keywords; 
		} 
		///  
		/// 获取网页meta的Desction 
		///  
		///  
		public string GetDescription() 
		{ 
			string description=""; 
			foreach(Tag tag in m_Tags) 
			{ 
				if(tag.TagName=="META") 
				{ 
					foreach(Attribute a in tag.TagAttributes) 
					{ 
						if(a.Name=="DESCRIPTION") 
							description+=a.Value+" "; 
					} 
				} 
				if(tag.TagName=="BODY") 
					break; 
			} 
			return description; 
		} 
		///  
		/// 获取HTML页面的所有文本内容 
		///  
		///  
		public string GetPageText() 
		{ 
			StringBuilder sb=new  StringBuilder(); 
			bool isDiscarded=false; 
			//遍历所有标记,不要SCRIPT STYLE内容  
			foreach(Tag tag in m_Tags) 
			{ 
				 
				//如果遇到SCRIPT标记,标志置真并返回,直到遇到/Script标记 
				if(tag.TagName=="SCRIPT") 
				{ 
					isDiscarded=true; 
					continue; 
				} 
				if(tag.TagName=="/SCRIPT") 
				{ 
					isDiscarded=false; 
				} 
				//如果遇到STYLE标记,将标记置真并返回,直到遇到/Style标记 
				if(tag.TagName=="STYLE") 
				{ 
					isDiscarded=true; 
					continue; 
				} 
				if(tag.TagName=="/STYLE") 
				{ 
					isDiscarded=false; 
				} 
				if( !isDiscarded && tag.FollowedText !="" ) 
				{ 
					if(tag.FollowedText.StartsWith(" ")) 
						tag.FollowedText.Replace(" ",""); 
					sb.Append(tag.FollowedText); 
				} 
			} 
			return sb.ToString(); 
		} 
		public string GetTitle() 
		{ 
			string title=""; 
			//遍历Tag标记,如果找到TITLE,则返回标记的文本 
			foreach(Tag tag in m_Tags) 
			{ 
				if(tag.TagName == "TITLE") 
				{ 
					title = tag.FollowedText; 
					break; 
				} 
				//如果找到BODY后仍没找到TITLE标记,则直接返回空字符串 
				if(tag.TagName=="BODY") 
					break; 
			} 
			return title; 
		} 
		///  
		/// 获取网页中的有效(有实质内容)标记,返回Tag类型的ArrayList. 
		///  
		///  
		public ArrayList GetValidTag() 
		{ 
			ArrayList al = new ArrayList(); 
			foreach( Tag tag in m_Tags) 
			{ 
				if( tag.FollowedText != "" && 
					tag.TagName != "SCRIPT" && 
					tag.TagName != "STYLE") 
				{ 
					HtmlText text = new HtmlText(); 
					text.TagName = tag.TagName; 
					text.Text = tag.FollowedText; 
					al.Add(text); 
				} 
			} 
			return al; 
		} 
	} 
}