如何将 HTML 读取为 XML?

Posted

技术标签:

【中文标题】如何将 HTML 读取为 XML?【英文标题】:How to read HTML as XML? 【发布时间】:2011-07-25 05:40:34 【问题描述】:

我想从从 Internet 下载的 html 页面中提取几个链接,我认为使用 linq to XML 对我的情况来说是一个很好的解决方案。 我的问题是我无法从 HTML 创建 XmlDocument,使用 Load(string 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(string xml) 加载该字符串时,出现异常

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

我应该采取什么方式将 html 文件读取为可解析的 XML

【问题讨论】:

HTML 不一定是有效的 XML。 HTML 基于 SGML,它本身是 XML 的超集(一种)。因此,您需要一个特殊的 HTML 解析器,而不是通用的 XML 解析器。 更多相同的答案和上面的评论。 HTML 不是 XML 【参考方案1】:

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

【讨论】:

【参考方案2】:

我自己没用过,不过建议你看看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;

【讨论】:

+1 我使用 SGMLReader 已经很多年了(自从它被引入以来)。它非常健壮,可以处理一些非常糟糕的畸形 HTML。【参考方案3】:

如您所述,如果您想从页面中提取一些链接,请尝试使用HTML Agility Pack。

此代码从网络获取一个页面并提取所有链接:

HtmlWeb web = new HtmlWeb();  
HtmlDocument document = web.Load("http://www.***.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】:

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

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

【讨论】:

如果我可以标记两个答案,我会标记你的两个答案。【参考方案5】:

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

【讨论】:

正则表达式几乎从来都不是解析 HTML 或 XML 的明智方法 我有想过,但我从来没有学过正则表达式,而且对于这么小的任务来说,学习它的主题太大了。

以上是关于如何将 HTML 读取为 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何读取xml文件导出为excel文件

j2me:如何将字节数组解析为 xml,然后从该 XML 读取和显示特定数据

c# 如何将string转化为xml形式 再读取想要的节点

将 HTML 表单数据保存为 XML

wpf 如何读取xml文件内容

如何在Matlab中将字符串存储在xml中以从opencv读取它