用XPath對Html進行解析

來源:互聯網
上載者:User

XPCOM

運用.NET Framework類來解析HTML檔案、讀取資料並不是最容易的。雖然你可以用.NET Framework中的許多類(如StreamReader)來逐行解析檔案,但XmlReader提供的API並不是“取出即可用(out of the box)”的,因為HTML的格式不規範。你可以用Regex(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並讀取資料了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.