Html 민첩성 팩 : 스크립트 태그 교체

c# html html-agility-pack

문제

그 코드에 의해 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>

분명히 우리가 여기서 찾을 수있는 코드는 아닙니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까 ?

업데이트 :

1 - HTML로 읽으려고 시도하기 때문에 InnerHtml 사용할 수 없습니다.

2 - HtmlNode.CreateNode 메서드가 "<"를 발견하면 중단됩니다. 태그의 시작 부분이라고 생각하지만 그렇지 않습니다.

수락 된 답변

기존의 스크립트 노드를 제거하고 스크립트 src의 uri에서 소스를 검색하고 결과가있는 새 노드를 추가 하기 때문에 구문 분석 된 HTML 문서에 script 노드를 추가하는 방법을 고려해야한다. 네가하고 싶은 것을 재현해라.

  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);

결론:

독점적으로 HtmlAgilityPackHtmlAgilityPack 경우 내 게시물은 궁극적으로 도움이되지 않습니다. 그렇지 않으면 AngleSharp 시도하면 문제가 해결됩니다.


인기 답변

HtmlAgilityPack 을 사용하면 HtmlAgilityPack 를 사용할 수 있습니다.

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


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.