Html敏捷包:替换脚本标签

本文关键字:替换 脚本 标签 Html | 更新日期: 2023-09-27 17:54:56

我想用它的代码替换html字符串中的JQuery script标签。意味着删除script标签,src属性设置为例如"scripts/JQuery -1.9.1.js",以script标签包含当前的JQuery源代码。

我用下面的代码创建了一个新节点:

HtmlNode node = new HtmlNode(HtmlNodeType.Element, htmlDocument, index);
node.Name = "script";
node.PrependChild(HtmlNode.CreateNode(jQuerySourceCodeString));

无论我对jQuerySourceCodeString做什么,它总是被截断为:

<script>/*!
 * jQuery JavaScript Library v1.9.1
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2013-2-4
 */
(function( window, undefined ) {
// Can't do this because several apps including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
// Support: Firefox 18+
//"use strict";
var
    // The deferred used on DOM ready
    readyList,
    // A central reference to the root jQuery(document)
    rootjQuery,
    // Support: IE</script>

显然不是我们在这里可以找到的代码

我做错了什么?

更新:

1 -我不能使用InnerHtml,因为它试图将其读取为html。

2 - HtmlNode.CreateNode方法在发现这个"<"时中断,它认为这是一个标签的开始,但它不是。

Html敏捷包:替换脚本标签

考虑到您的问题是如何将script节点添加到已解析的html文档(,因为您想要删除现有的脚本节点,从脚本src的uri检索源,并添加一个新的结果),我创建了一个示例来重现您想要做的事情。

  1. 我将jquery 1.9.1的cdn保存到本地文件
  2. 然后我尝试将其附加到html文档,在script节点下

我尝试了一些HtmlAgilityPack的尝试,但结果的html总是有一个尾随垃圾,看起来像

</div></10></=></9></=8></"></$1></(?!area|br|col|embed|hr|img|input|link|meta|param)((['w:-]+)[^></(?:"></use></9></table></tfoot></thead></tbody></table></tbody></9></=></"></['w'w]+></tag></'></(['w-]+)'s*'></number></9></9></1.9.8+></10></=8></script>
然后我放弃了,并尝试了另一个我(更)经常使用的html解析器- AngleSharp。有了它,我得到了一个正确的结果html。

下面是两次尝试的代码片段:

HtmlAgilityPack:

string html = @"
    <html>
    <head><title>SO Question</title></head>
    <body>
        <div>
            text text text
        </div>
    </body>
    <script>
        var a = 10;
    </script>
    </html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNode jsNode = new HtmlNode(HtmlNodeType.Element, doc, 0);
jsNode.Name = "script";
jsNode.InnerHtml = jsCode;
doc.DocumentNode.InsertAfter(jsNode, doc.DocumentNode.SelectSingleNode("body"));
File.WriteAllText("D:/jsCodeOut.html", doc.DocumentNode.InnerHtml);

AngleSharp:

string html = @"
    <html>
    <head><title>SO Question</title></head>
    <body>
        <div>
            text text text
        </div>
    </body>
    <script>
        var a = 10;
    </script>
    </html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlParser hp = new HtmlParser();
var parsedHtml = hp.Parse(html);
var scriptNode = parsedHtml.CreateElement("script");
scriptNode.InnerHtml = jsCode;
parsedHtml.DocumentElement.AppendChild(scriptNode);
File.WriteAllText("D:/angleSharpOutput.html", parsedHtml.DocumentElement.InnerHtml);

结论:

如果你需要专门做HtmlAgilityPack,那么我的帖子最终没有帮助。否则,尝试AngleSharp,您已经解决了您的问题。

对于HtmlAgilityPack,您可以使用textNode:

jsNode.AppendChild(doc.CreateTextNode(jsCode));