【问题标题】:Html Agility Pack: replacing script tagsHtml Agility Pack:替换脚本标签
【发布时间】:2016-10-14 22:37:14
【问题描述】:

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

我使用此代码创建了一个新节点:

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>

这显然不是我们能找到的代码here

我做错了什么?

更新:

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

2 - HtmlNode.CreateNode 方法在找到这个“

【问题讨论】:

    标签: c# html html-agility-pack


    【解决方案1】:

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

    1. 我将cdn for jquery 1.9.1 保存到本地文件中
    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。

    以下是两次尝试的代码 sn-ps:

    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 找到解决方案会很有趣:)
    • 我认为唯一的解决方案是修改他们的源代码。
    【解决方案2】:

    HtmlAgilityPack 可以使用 textNode:

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

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多