SgmlReader是一款SGML解析器,通过解析html文件,并能有效的把html转换为格式较规范的XHTML。
所以,再利用XPath去查找你所想要的值是非常方便的。
个人分析HTML方法:
1.正则表达式
2.字符串截取
3.把HTML代码当成树形结构理解,想取到哪个节点的值很方便(属xml的一种)
最近朋友需要一些房地产的数据,我试着找了一些采集的方法,google很多,最终无果。花一个晚上自己写了个简单房地产数据采集。
核心是利用SgmlReader生成XHTML文档后,根据XPath 语句来读取数据。
步骤:
1. 下载WebURL HTML 代码以StreamReader 返回
Code
1 Random ro = new Random();
2 int r = ro.Next();
3 string strUrl = url + “&id=“ + r.ToString();
4
5 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
6 request.Method = WebRequestMethods.Http.Get;
7 request.Timeout = 10000;
8 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
9 StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(“utf-8“));
10
11 return reader;
2.在得到远程的HTML文件后,你就可以创建一个SgmlReader类的实例了。通过将其DocType属性设置为“HTML”,HTML文件的响应流可以被加载到SgmlReader实例,通过其InputStream属性进行解析。首先将HTML文件流加载到一个TextReader对象,然后将TextReader赋值给InputStream属性:
SgmlReader reader
=
new
SgmlReader();
2
reader.DocType
=
“
HTML
“
;
3
reader.InputStream
=
new
StringReader(sReader.ReadToEnd());
//
sReader为远程HTML所返回的
3.现在,你就可以通过调用SgmlReader的Read()方法来解析HTML文件了:
Code
1 StringWriter sw = new StringWriter();
2 XmlTextWriter writer = new XmlTextWriter(sw);
3 writer.Formatting = Formatting.Indented;
4 while (reader.Read())
5 {
6 if (reader.NodeType != XmlNodeType.Whitespace)
7 {
8 writer.WriteNode(reader, true);
9 }
10 }
4.因为SgmlReader创建了格式规范的HTML,所以你可以用XPath语句来读取不同的节点。下面的代码说明了如何将SgmlReader生成的输出结果加载到一个XPathNavigator,然后如何用一个XPath语句来查询HTML文件结构:
Code
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator nodes = nav.Select(xPaths);//xpath表达式
while (nodes.MoveNext())
{
str += nodes.Current.Value + “|“;//str为你所根据xpath取到的值
}
return str;
例:如下HTML代码,要取到这个img的src地址
Code
HTML:
<div class=“pBorder“ align=“left“>
<img src=“http://pic.xxxxx.com/images/images/2009-04/461232.jpg“ alt=“新世界四季山水“ title=“新世界四季山水“>
</div>
XPath 为:xpath
= “//div[@class=’pBorder’]/img/@src“;传入上面方法中及返回:http:
//pic.xxxxx.com/images/images/2009-04/461232.jpg
如果你对XPath语言已经很熟悉,并了解.NET Framework中不同的XML解析API了,那么你就可以很容易地用SgmlReader类来解析HTML并读取数据了。
附:SgmlReader下载:http://download.csdn.net/source/1440928
转载于:https://www.cnblogs.com/dannyqiu/articles/1902955.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110682.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...