c# - 从 HTML 节点读取值

标签 c# html html-parsing

我是 XML/HTML 解析的新手。甚至不知道正确的词来正确搜索重复项。

我有这样的 HTML 文件:

<body id="s1" style="s1">
    <div xml:lang="uk">
        <p begin="00:00:00" end="00:00:29">
          <span fontFamily="SchoolHouse Cursive B" fontSize="18">I'm great!</span>
        </p>

现在我需要 00:00:0000:00:29I'm great! 来自它。我可以这样读:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    if (reader.LocalName == "span")
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNode elem = doc.DocumentElement.FirstChild;
        var c = elem.InnerText;
    }
 }

我在变量 abc 中获取值。但 HTML 格式略有变化。 现在 HTML 看起来像这样:

<body id="s1" style="s1">
  <div xml:lang="uk">
      <p begin="00:00:00" end="00:00:29">I'm great! </p>

在这种情况下,我如何解析出 00:00:0000:00:29I'm great! ?我试过这个:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
    XmlNode elem = doc.DocumentElement.FirstChild;
    var c = elem.InnerText;
}

但我收到此错误:This document already has a 'DocumentElement' node. at line doc.Load(reader)。如何正确阅读以及导致问题的原因是什么?我正在使用 .NET 2.0

最佳答案

看起来您有想要使用 XML 解析器解析的 HTML。这也可能是您得到 This document already has a 'DocumentElement' node. 异常的原因:因为您有多个根节点,这在 HTML 中是允许的(或更好:容忍的),但不是 XML。

改用 HTML 解析器。不幸的是,.NET 框架中没有内置任何东西。您必须为此使用第三方库。一个非常好的是 HTML agility pack ,那个 oleksii 已经在他的评论中提到了。

编辑:

从您的评论中,我感觉您不熟悉 HTML 和 XML 之间没有直接关系这一事实。图片取自 here很好地说明了这一点:

Relation between SGML, HTML and XML

XML 既不是 HTML 的子集,也不是相反。仅当您拥有严格的 XHTML(这种情况很少见)时,您才能拥有可以使用 XML 解析器解析的 HTML 文档。但要注意,如果此类 XHTML 文档的代码中存在错误,解析器将失败,而普通浏览器将继续显示该页面。此外,XHTML 的 future 相当不明朗,现在 HTML5 正在缓慢但稳步地走向生活......

总结:为了避免所有这些陷阱,走简单的路,选择 HTML 解析器。

关于c# - 从 HTML 节点读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277380/

相关文章:

php - 找到它下面的 h3 和 h4 标签

c# - Xna 内容管道扩展 - 在自定义处理器中加载其他内容

c# - 全屏 DirectX 覆盖?是的..又是C#

c# - NetworkStream ReadAsync 和 Read 同一个方法

c# - yield 和 List.AsEnumerable 之间的区别

JQuery 输入[type=date] 选择器

java - 在不改变页面的情况下提取和处理textarea值形式

javascript - 删除动态前置的 div

java - Jsoup.parse() 与 Jsoup.parse() - 或者 URL 检测在 Jsoup 中是如何工作的?

html - BeautifulSoup 仅解析一列而不是 Python 中的整个维基百科表