获取HTML网页内容SgmlReader

来源:互联网 发布:sql注入的步骤 编辑:程序博客网 时间:2024/05/09 22:32

Microsoft的XML大师Chris Lovett发布了一个新的SGML解析器(应该是2008年的版本),叫做SgmlReader(早期的SgmlReader在2006年以前就出了),它可以解析HTML文件,甚至将它们转换成一个格式规范的结构。SgmlReader派生于XmlReader,这就是说,你可以像运用诸如XmlTextReader这样的类来解析XML文件那样来解析HTML文件。

说明+最新源码:http://developer.mindtouch.com/en/docs/SgmlReader
备用源码地址:http://archive.msdn.microsoft.com/SgmlReader
也可参考:http://www.xmlforasp.net/codeSection.aspx?csID=94
 
将其实际应用的结果如图:
1. 示例网页(我们需要获取的):
 

 
 
2. 获取<body>内所有标签的值
 
 

 
 
3. 获取<html>内所有alt属性值(图片提示信息)
 

 
 
4. 获取<body>内<div>标签属性id为"frame"下,<div>标签属性id为"bodyArea",层内所有标签值
 

 
 
5. 以上示例都是获取远端HTML页面(http://172.16.1.5/menu_en.html)源码内容的示例,以下是获取本地HTML内标签值示例。
 
 

 
  1. private string GetWellFormedHTMLFile(string filePath, string xpath) 
  2.         { 
  3.             StreamReader sReader = null
  4.             StringWriter sw = null
  5.             SgmlReader reader = null
  6.             XmlTextWriter writer = null
  7.             try 
  8.             { 
  9.                 sReader = new StreamReader(filePath); 
  10.                 reader = new SgmlReader(); 
  11.                 reader.DocType = "HTML"
  12.                 reader.InputStream = new StringReader(sReader.ReadToEnd()); 
  13.                 sw = new StringWriter(); 
  14.                 writer = new XmlTextWriter(sw); 
  15.                 writer.Formatting = Formatting.Indented; 
  16.                 //writer.WriteStartElement("Test"); 
  17.                 while (reader.Read()) 
  18.                 { 
  19.                     if (reader.NodeType != XmlNodeType.Whitespace) 
  20.                     { 
  21.                         writer.WriteNode(reader, true); 
  22.                     } 
  23.                 } 
  24.                 //writer.WriteEndElement(); 
  25.                 if (xpath == null
  26.                 { 
  27.                     return sw.ToString(); 
  28.                 } 
  29.                 else 
  30.                 { //Filter out nodes from HTML 
  31.                     StringBuilder sb = new StringBuilder(); 
  32.                     XPathDocument doc = new XPathDocument(new StringReader(sw.ToString())); 
  33.                     XPathNavigator nav = doc.CreateNavigator(); 
  34.                     XPathNodeIterator nodes = nav.Select(xpath); 
  35.                     while (nodes.MoveNext()) 
  36.                     { 
  37.                         sb.Append(nodes.Current.Value + ((char)13).ToString()); 
  38.                     } 
  39.                     return sb.ToString(); 
  40.                 } 
  41.             } 
  42.             catch (Exception exp) 
  43.             { 
  44.                 writer.Close(); 
  45.                 reader.Close(); 
  46.                 sw.Close(); 
  47.                 sReader.Close(); 
  48.                 return exp.Message; 
  49.             } 
  50.         } 
原创粉丝点击