【问题标题】:How to find the end head tag in a html output如何在 html 输出中找到结束头标记
【发布时间】:2012-03-15 14:46:25
【问题描述】:

我想从 http 模块中页面的 html 输出中找到标签的索引。 我正在使用

HTMLOutput.IndexOf("</head>");

其中 HTMLOutput 是字符串参数,它包含特定页面的整个 html 输出。 使用上述方法,我能够找到结束头标签的索引,但只有当它是唯一的结束头标签时,当页面中有一些 javascript 函数插入一些动态 html 内容并包含一些结束头标签时,就会出现问题例如,在其中,

newWindow.document.writeln('</head>')

如果页面中有一些由第三方工具添加的注释行,其中包含。

所以我无法找到原始标签的索引,有人知道如何解决这个问题吗?可能是一些正则表达式或在这种情况下可以帮助我的东西。

谢谢, 马克

【问题讨论】:

  • 您必须为此使用 HTML 解析器,而不是正则表达式。
  • @Qtax 现在我正在使用 HTMLAgility 包,你能建议我如何找到 标签
  • 您需要编写 Xpath 以在 Html Agility pack 中查找特定元素。访问此处以了解有关 kossovsky.net/index.php/2009/07/… 的更多信息
  • @Mac,我对 C# HTML 解析器一无所知,因此无法帮助您。我猜你可以使用解析器找到完整的head 元素,获取它在输入字符串中的起始位置,以及它的内容长度,然后使用这些数字来计算&lt;/head&gt; 的位置(如果解析器不能直接给你)。
  • @Mac:为什么要查找结尾&lt;head&gt;标签的索引?你想在里面/外面注入一些东西吗?

标签: c# regex string html-parsing html-agility-pack


【解决方案1】:

如果你可以确保所有的 javascript 代码都在标签中,那么你可以使用

HTMLOutput.LastIndexOf("</head>");

但更好的是使用“HTMLAgilityPack”并解析您的内容。

【讨论】:

    【解决方案2】:

    您可以使用 Html Agility Pack 找到 &lt;head&gt; 标签,然后在其中注入您的 &lt;script&gt; 元素:

    var doc = new HtmlDocument();
    doc.LoadHtml(HTMLOutput);
    var head = doc.DocumentNode.SelectSingleNode("//head");
    head.AppendChild(HtmlNode.CreateNode("<script>...</script>"));
    

    要获得结果 HTML,您可以使用:

    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        HTMLOutput = writer.ToString();
    }
    

    现在HTMLOutput 变量保存了修改后的 HTML。

    【讨论】:

    • 我是否必须保存或其他内容,因为上述更改未反映在页面加载后
    • 如果我继续使用 HTMLOutput = doc.DocumentNode.OuterHtm() 会怎样,它们是相同的还是与您更新的代码部分有任何差异。虽然两者对我来说都很好,谢谢你
    • @Mac:实际上没有区别。但在某些情况下,.OuterHtml 可能会产生不正确的结果。请参阅this 答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多