C# 如何在html输出中找到end-head标记

C# 如何在html输出中找到end-head标记,c#,regex,string,html-parsing,html-agility-pack,C#,Regex,String,Html Parsing,Html Agility Pack,我想从http模块中页面的html输出中找到标签的索引。 我正在使用 HTMLOutput.IndexOf("</head>"); HTMLOutput.IndexOf(“”); 其中,HTMLOutput是字符串参数,它包含特定页面的整个html输出。 使用上述方法,我能够找到end head标记的索引,但只有当它是唯一的end head标记时,当页面中存在一些javascript函数时才会出现问题,这些函数插入一些动态html内容并包含一些end head标记,例如 newW

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

HTMLOutput.IndexOf("</head>");
HTMLOutput.IndexOf(“”);
其中,HTMLOutput是字符串参数,它包含特定页面的整个html输出。 使用上述方法,我能够找到end head标记的索引,但只有当它是唯一的end head标记时,当页面中存在一些javascript函数时才会出现问题,这些函数插入一些动态html内容并包含一些end head标记,例如

newWindow.document.writeln('</head>')
newWindow.document.writeln(“”)
此外,如果页面中有一些由第三方工具添加的注释行,这些工具包含在页面中

所以我找不到原始标记的索引,有人知道如何解决这个问题吗?可能是一些正则表达式或其他可以在这个场景中帮助我的东西

谢谢,
Mac

如果您可以确保所有javascript代码都位于标记中,那么您可以使用

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

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

如果您可以确保所有javascript代码都位于标记中,那么您可以使用

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

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

您可以使用Html Agility Pack找到
标记,然后将
元素插入其中:

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

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

您可以使用HTML Agility Pack查找
标记,然后将
元素插入其中:

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

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

您必须为此使用HTML解析器,而不是正则表达式。@Qtax现在我使用的是HTMLAgility pack,您能否建议我如何找到标记您需要编写Xpath才能在HTML Agility pack中找到特定元素。请访问此处了解更多关于@Mac的信息,我对C#HTML解析器一无所知,因此无法在这方面帮助您。我猜您可以使用解析器找到完整的
head
元素,获得它在输入字符串中的起始位置及其内容的长度,然后使用这些数字来计算
的位置(如果解析器不能直接给您)@Mac:为什么要查找end
标记的索引?你想在它的内部/外部注入一些东西吗?你必须使用HTML解析器,而不是正则表达式。@Qtax现在我正在使用HTMLAgility pack,你能建议我如何找到标记吗?你需要编写Xpath来查找HTML Agility pack中的特定元素。请访问此处了解更多关于@Mac的信息,我对C#HTML解析器一无所知,因此无法在这方面帮助您。我猜您可以使用解析器找到完整的
head
元素,获得它在输入字符串中的起始位置及其内容的长度,然后使用这些数字来计算
的位置(如果解析器不能直接给您)@Mac:为什么要查找end
标记的索引?你想在它的内部/外部注入一些东西吗?我必须保存吗?或者是因为上面的更改没有反映在加载后的页面中。如果我继续使用HTMLOutput=doc.DocumentNode.OuterHtm(),它们是相同的还是与你更新的代码部分有任何差异。尽管这两个都对我来说工作正常,幸亏you@Mac:实际上没有区别。但在某些情况下,
.OuterHtml
可能会产生不正确的结果。请参阅答案。我是否必须保存或执行其他操作,因为在页面加载后,上述更改没有反映在中。如果我继续使用HTMLOutput=doc.DocumentNode.OuterHtm(),它们是否相同或与您更新的代码部分有任何差异。尽管这两个操作对我来说都很好,幸亏you@Mac:实际上没有区别。但在某些情况下,
.OuterHtml
可能会产生不正确的结果。见答案。