2011-03-29 61 views
6

我想從一個從互聯網下載的html頁面中提取幾個鏈接,我認爲使用linq to XML對我來說是一個很好的解決方案。
我的問題是,我不能創建從HTML一個XmlDocument,使用Load(字符串URL)沒有工作,所以我用下載的HTML字符串:如何將HTML讀取爲XML?

public static string readHTML(string url) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
     StreamReader sr = new StreamReader(res.GetResponseStream()); 

     string html = sr.ReadToEnd(); 
     sr.Close(); 
     return html; 
    } 

當我嘗試加載使用的loadXML(字符串XML)我得到的異常字符串

'--' is an unexpected token. The expected token is '>' 

我應該採取什麼方式向HTML文件中讀取到一個可解析XML

+5

HTML不一定是有效的XML。 HTML基於SGML,它本身是一種超集(一種)XML。因此,您需要一個特殊的HTML解析器,而不是一個通用的XML解析器。 – 2011-03-29 12:06:31

+0

更多相同的答案在下面和上面評論。 HTML不是XML – 2011-03-29 12:09:09

回答

12

HTML根本是不一樣的XML(除非HTML實際上恰巧符合XHTML或HTML5在XML模式下)。最好的方法是使用HTML parser來閱讀HTML。之後,您可以將它轉換爲Linq到XML - 或者直接處理它。

3

HTML不是XML。 HTML基於SGML,因此不能確保標記是格式良好的XML(XML是SGML本身的一個子集)。您只能將XHTML(即兼容XML的HTML)解析爲XML。但是,對於大多數網站來說,情況並非如此。

要使用HTML,您需要使用HTML解析器。

+0

如果我可以標記兩個答案,我會標記你的答案。 – Ziv 2011-03-29 17:44:54

0

如果你知道你感興趣的節點,我會使用正則表達式從字符串中提取鏈接。

+6

正則表達式幾乎從來都不是解析HTML或XML的明智方法 – 2011-03-29 13:55:26

+1

我曾經想到過,但我從來沒有學過正則表達式,並且它太大以至於無法學習如此小的任務。 – Ziv 2011-03-29 17:41:39

+1

https://stackoverflow.com/a/1732454/321973 – 2017-01-04 10:34:37

9

我自己並沒有使用它,但我建議你看看SGMLReader。下面是從他們的主頁的樣本:

XmlDocument FromHtml(TextReader reader) { 

    // setup SgmlReader 
    Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader(); 
    sgmlReader.DocType = "HTML"; 
    sgmlReader.WhitespaceHandling = WhitespaceHandling.All; 
    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; 
} 
+0

+1我已經使用SGMLReader很多年了(自推出以來)。它非常強大,可以處理一些非常爛的格式錯誤的HTML。 – 2016-11-14 21:17:10

1

如果你想提取從頁面的一些鏈接,正如你所說,嘗試使用HTML Agility Pack

此代碼從網絡獲取一個網頁,並提取所有鏈接:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument document = web.Load("http://www.stackoverflow.com"); 
HtmlNode[] links = document.DocumentNode.SelectNodes("//a").ToArray(); 

打開從磁盤上的HTML文件,並獲得URL特定鏈接:

HtmlDocument document2 = new HtmlDocument(); 
document2.Load(@"C:\Temp\page.html") 
HtmlNode link = document2.DocumentNode.SelectSingleNode("//a[@id='myLink']"); 
Console.WriteLine(link.Attributes["href"].Value);