解析HTML文件 - 运用SgmlReader类来解析HTML文件
运用.NET Framework类来解析HTML文件、读取数据并不是最容易的。虽然你可以用.NET Framework中的许多类(如StreamReader)来逐行解析文件,但XmlReader提供的API并不是“取出即可用(out of the box)”的,因为HTML的格式不规范。你可以用正则表达式(regular expression),但如果你对这些表达式运用不熟练,你可能开始时会觉得它们有些难。
Microsoft的XML大师Chris Lovett最近在http://www.gotdotnet.com网站上发布了一个新的SGML解析器,叫做SgmlReader,它可以解析HTML文件,甚至将它们转换成一个格式规范的结构。SgmlReader派生于XmlReader,这就是说,你可以像运用诸如XmlTextReader这样的类来解析XML文件那样来解析HTML文件。在本文中,我将介绍如何用SgmlReader类来解析HTML文件并生成格式规范的HTML,从而使你可以用XPath语句来读取数据。
创建一个SgmlReader实例来解析HTML
在开始运用SgmlReader前,从gotdotnet.com下载它,并将assembly放到你的应用程序bin folder中。在可以运用assembly集后,编写代码来读取你想解析的HTML。在本文的例子中,我们用了HttpWebRequest和HttpWebResponse对象来访问一个远程的HTML文件: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);HttpWebResponse res = (HttpWebResponse)req.GetResponse();StreamReader sReader = new StreamReader(res.GetResponseStream());
在得到远程的HTML文件后,你就可以创建一个SgmlReader类的实例了。通过将其DocType属性设置为“HTML”,让用户知道你正在处理HTML文件: SgmlReader reader = new SgmlReader();reader.DocType = "HTML";
HTML文件的响应流可以被加载到SgmlReader实例,通过其InputStream属性进行解析。首先将HTML文件流加载到一个TextReader对象,然后将TextReader赋值给InputStream属性: reader.InputStream = new StringReader(sReader.ReadToEnd());
现在,你就可以通过调用SgmlReader的Read()方法来解析HTML文件了: sw = new StringWriter();writer = new XmlTextWriter(sw);writer.Formatting = Formatting.Indented;while (reader.Read()) { if (reader.NodeType != XmlNodeType.Whitespace) writer.WriteNode(reader, true); }}
因为SgmlReader创建了格式规范的HTML,所以你可以用XPath语句来读取不同的节点。下面的代码说明了如何将SgmlReader生成的输出结果加载到一个XPathNavigator,然后如何用一个XPath语句来查询HTML文件结构: StringBuilder sb = new StringBuilder();XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));XPathNavigator nav = doc.CreateNavigator();XPathNodeIterator nodes = nav.Select(xpath);while (nodes.MoveNext()) { sb.Append(nodes.Current.Value);}return sb.ToString();
点击此处来查看SgmlReader类的一个实例演示。
如果你对XPath语言已经很熟悉,并了解.NET Framework中不同的XML解析API了,那么你就可以很容易地用SgmlReader类来解析HTML并读取数据了。
部分代码C#
private string GetWellFormedHTML(string uri,string xpath) ...{ StreamReader sReader = null; StringWriter sw = null; SgmlReader reader = null; XmlTextWriter writer = null; try ...{ if (uri == String.Empty) uri = "http://www.XMLforASP.NET"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); sReader = new StreamReader(res.GetResponseStream()); reader = new SgmlReader(); reader.DocType = "HTML"; reader.InputStream = new StringReader(sReader.ReadToEnd()); sw = new StringWriter(); writer = new XmlTextWriter(sw); writer.Formatting = Formatting.Indented; //writer.WriteStartElement("Test"); while (reader.Read()) ...{ if (reader.NodeType != XmlNodeType.Whitespace) ...{ writer.WriteNode(reader, true); } } //writer.WriteEndElement(); if (xpath == null) ...{ return sw.ToString(); } else ...{ //Filter out nodes from HTML StringBuilder sb = new StringBuilder(); XPathDocument doc = new XPathDocument(new StringReader(sw.ToString())); XPathNavigator nav = doc.CreateNavigator(); XPathNodeIterator nodes = nav.Select(xpath); while (nodes.MoveNext()) ...{ sb.Append(nodes.Current.Value + " "); } return sb.ToString(); } } catch (Exception exp) ...{ writer.Close(); reader.Close(); sw.Close(); sReader.Close(); return exp.Message; } }
解析HTML文件 - 运用SgmlReader类来解析HTML文件相关推荐
- linux读取class下的文件路径,Class类getResource方法获取文件路径
在应用程序中,经常有需求获取资源文件的路径,并加载之. 其中一个方法就是使用绝对路径,比如: File file = new File("D://xxxx"); 但是不支持跨系统, ...
- php mp3文件上传 类,PHP MP3歌曲文件上传
publicfunctionupload(){$upload=new\Think\Upload();//实例化上传类$upload->maxSize=3*1024*1024;//设置附件2113 ...
- 文件映射操作类的实现
文章目录 1 文件映射操作类的实现 1 文件映射操作类的实现 mmap_file_op.h: #ifndef QINIU_LARGEFILE_MMAPFILE_OP_H_ #define QINIU_ ...
- C++文件输入/输出流类
文章目录 文件输入/输出流类 表5: 文件读写模式 表6:ios_base 标识的组合意义 ofstream:写入文件的流类 例8:输出文本文件 例9:输出二进制文件 ifstream:从文件中读取的 ...
- Properties文件和Properties类
Properties文件和Properties类 是什么 Properties文件 Properties类 简述 构造方法 基本的存储方法 与流相关的方法 Properties文件和Propertie ...
- Springboot实现文件上传,并防止同文件重复上传
目录 主要流程 编写接受文件上传的Controller 编写文件操作结果类 编写文件操作类 知识总结 参考 主要流程 在配置文件中添加文件操作的配置,示例: storage:image:#保存位置sa ...
- kotlin 读取json文件_Kotlin数据类及json解析
通过数据类,可以方便地得到很多有趣的函数,一部分是来自属性,比如编写getter和setter函数,还有下面这些函数:equals(): 比较两个对象的属性来确保他们是相同的. hashCode(): ...
- java常用类解析五:IO系统File类及文件搜索工具类
1.先看一个File类的简单的例子 [java] view plaincopy <span style="font-size:16px;">package test; ...
- python中读取文件内容-深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
最新文章
- db2关闭下一句sql的日志_MySQL 用户和权限管理,日志体系简介
- Python 实现批量从不同的Linux服务器下载文件
- 快来围观一下JavaScript的Proxy
- php 计划任务 不执行,CentOS 系统下 Laravel 计划任务 PHP artisan schedule:run 不执行,应该如何处理?...
- USACO-Section1.5 Arithmetic Progressions(枚举)
- java 获取http地址_java如何获取当前时间,java如何获取ip地址
- python启动远端 exe_python打包exe开机自动启动的实例(windows)
- python三大圣经-读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」...
- scrollIntoView()窗口滚动
- 算法学习——递归和排列组合
- 国产化性能最高的服务器,盘点服务器国产化呼声背后的优秀厂商
- python爬虫实战:之爬取京东商城实例教程!(含源代码)
- 网页集成高德地图显示
- c#Winform自定义控件-目录
- 低照度水下图像增强论文(L2UWE)+代码+评价方法
- python中的除法、取整和求模_python中的除法,取整和求模
- char *str1 和 char str2[]的详解
- android 关于闹钟
- 俞军产品方法论|第三章 交易|摘要笔记
- 基于R对数据中分类变量按照某一个分类变量的类别计算频数
热门文章
- C语言实现数值积分之Simpson 1/3法则(附完整源码)
- C语言实现数组Array(附完整源码)
- 经典C语言程序100例之十五
- C++变量、函数在内存中的情况
- linux上的ftp怎么设置编码格式,linux ftp客户端的编码问题
- 24-Logistic Regression
- Spark Streaming实现实时WordCount,DStream的使用,updateStateByKey(func)实现累计计算单词出现频率
- 11Linux服务器编程之:VFS虚拟文件系统,dup()函数和dup2()函数
- ContextLoaderListener的用途以及配置方式
- JavaGUI中的JComboBox的处理