如何将HTML读作XML?

时间:2011-03-29 12:03:00

标签: c# html xml html-parsing

我想从互联网下载的html页面中提取几个链接,我认为使用linq to XML对我的情况来说是一个很好的解决方案。
我的问题是我无法从HTML创建XmlDocument,使用Load(字符串url)不起作用所以我使用以下命令将html下载到字符串:

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 个答案:

答案 0 :(得分:14)

HTML与XML不同(除非HTML实际上恰好符合XML模式下的XHTML或HTML5)。最好的方法是使用HTML parser来读取HTML。之后,您可以将其转换为Linq to XML - 或直接处理它。

答案 1 :(得分: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;
}

答案 2 :(得分:3)

HTML不是XML。 HTML基于SGML,因此不能确保标记是格式良好的XML(XML是SGML本身的子集)。您只能将XHTML(即XML兼容的HTML)解析为XML。但当然大多数网站都不是这样。

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

答案 3 :(得分:2)

如果您想从页面中提取某些链接(如上所述),请尝试使用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);

答案 4 :(得分:0)

如果您知道您感兴趣的节点,我会使用正则表达式从字符串中提取链接。