SgmlReader使用方法
HtmlAgilityPack是一個開源的html解析器,底層是通過將html格式轉成標準的xml格式文件來實現的(使用dot net里的XPathDocument等xml相關類),可以從這里下載:http://htmlagilitypack.codeplex.com。可以通過指定xpath路徑提取需要的內容,上面那個網站也提供了一個自動生成xpath路徑的工具HAP Explorer。缺點和上面使用mshtml com組件一樣,內存占用非常大,會耗光所有物理內存。
3、使用SgmlReader
SgmlReader也是一個開源的解析器,可以從這里下載(微軟自己網站上的那個不完整,缺少一些文件)。用這個工具先將html文件轉成標準的xml格式文件,再通過制定xpath路徑來提取所需要的內容(xpath路徑可以通過上面的那個工具生成)。下面一個簡單的示例代碼:
XPathDocument pathDoc = null;
using (SgmlReader sgmlReader = new SgmlReader())
{
sgmlReader.DocType = "HTML";
sgmlReader.InputStream = new StringReader(html);
using (StringWriter stringWriter = new StringWriter())
{
using (XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter))
{
while (!sgmlReader.EOF)
{
xmlWriter.WriteNode(sgmlReader, true);
}
string xml = stringWriter.ToString().Replace("xmlns=\"http://www.w3.org/1999/xhtml\"", "");
pathDoc = new XPathDocument(new StringReader(xml));
}????????????????????
}
}
//提取出整個table
string xpath = "//div[@class=\"infoList\"]/table";//xpath表達式
XPathNavigator nav = pathDoc.CreateNavigator();
XPathNodeIterator nodes = nav.Select(xpath);
if (!nodes.MoveNext())
{
return;
}
nodes = nodes.Current.Select("//tr");
if (!nodes.MoveNext()) return;
string str = "";
while (nodes.MoveNext())
{
//遍歷所有行
XPathNodeIterator tdNode = nodes.Current.Select("./td");
while (tdNode.MoveNext())
{
//遍歷列
str += tdNode.Current.Value.Trim() + " ";
}
str += "\r\n";??
}
//輸出結果
Console.WriteLine(str);
如果要提取圖片的src,xpath寫成這樣://div[@class=\"infoList\"]/img/@src注意:
上面的這行 stringWriter.ToString().Replace("xmlns=\"http://www.w3.org/1999/xhtml\"", "");
使用SgmlReader轉換后的html會在根元素<html>自動加上命名空間http://www.w3.org/1999/xhtml,變成這樣:
<html xmlns="http://www.w3.org/1999/xhtml">
如果不把這個xmlns="http://www.w3.org/1999/xhtml"移走,那么
XPathNodeIterator nodes = nav.Select(xpath);
這條語句將取不出來內容,也即是nodes.MoveNext()的值將會是false,網上很多例子里都沒有提到這點
例子中的html樣本:
<html>
<head>
<title>示例Test</title>
</head>
<body>
<div id="a1" class="a1">
<div class="infoList" id="infoList">
<div class="clearit"></div>
<table cellspacing="0">
<tr>
<td>甲A</td>
<td class="td2">09-25 00:00</td>
</tr>
<tr>
<td>德乙</td>
<td class="td2">09-26 10:10</td>
</tr>
</table>
<img src="http://www.aaaa.com/images/b234.jpg" alt="圖片1" title="圖片1">
</div>
</div>
</doby>
</html>
使用SgmlReader的好處就是內存占用穩定,在俺實際使用中內存上下浮動不會超過20M(2個線程,間隔60秒抓取一個新頁面,7*24小時不間斷的后臺服務程序)。不足就是html轉成xml格式耗時間
總結
以上是生活随笔為你收集整理的SgmlReader使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房贷不还有什么后果
- 下一篇: 公务员贷款申请流程有哪些