2011-08-29 118 views
0

我想在我的C#程序中解析網站的HTML。我使用 DLL將HTML轉換爲XML。我用下面的方法如下:簡單的XPath查詢:無結果

XmlDocument FromHtml(TextReader reader) 
{ 
    // setup SGMLReader 
    Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader(); 
    sgmlReader.DocType = "HTML"; 
    sgmlReader.WhitespaceHandling = WhitespaceHandling.None; 
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower; 
    sgmlReader.InputStream = reader; 

    // create document 
    XmlDocument doc = new XmlDocument(); 
    doc.PreserveWhitespace = true; 
    doc.XmlResolver = null; 
    doc.Load(sgmlReader); 
    return doc; 
} 

接下來,我讀了一個網站,並嘗試去尋找header節點:

var client = new WebClient(); 
var xmlDoc = FromHtml(new StringReader(client.DownloadString(@"http://www.switchonthecode.com"))); 
var result = xmlDoc.DocumentElement.SelectNodes("head"); 

然而,這個查詢給出了一個空的結果(計數== 0 )。但是,當我檢查xmlDoc.DocumentElement的結果來看,我看到以下內容:

VS watch

任何想法就是爲什麼目前還沒有結果?請注意,當我嘗試其他網站時,如http://www.google.com,它可以正常工作。

+0

有一個關於'head'命名空間 - 你可以看到它的截圖 – Cameron

回答

2

您需要明確地選擇使用名稱空間,請參閱question

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
manager.AddNamespace("ns", "http://www.w3.org/1999/xhtml"); 

doc.DocumentElement.SelectNodes("ns:head", manager); 
1

您可以改爲使用HTML Agility Pack。這是一個開源的HTML解析器

+0

技術上,TheCodeKing給出了正確答案的問題。不過,我已經嘗試過你的建議,並且它更容易工作,因爲不需要命名空間!謝謝。 –