Html Agility Pack:替換腳本標籤

c# html html-agility-pack

我想用它的代碼替換html字符串中的JQuery script標記。裝置移除所述script與標籤src設置為例如“腳本/ 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方法在找到“<”時中斷,它認為它是標記的開頭,但事實並非如此。

一般承認的答案

考慮到你的問題是如何將script節點附加到解析的html文檔中( 因為你要刪除現有的腳本節點,從腳本src的uri中檢索源代碼,並附加一個帶有結果的新腳本 ),我創建了一個樣本重現你想做的事。

  1. 我把cdn用於jquery 1.9.1並將其保存到本地文件中
  2. 然後我嘗試將它附加到script節點下的html文檔中

我嘗試了一些使用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));


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因