Html Agility Packを使用してフォーム要素全体を文字列として取得

c# html-agility-pack

質問

これは、私がHtml Agility Packを使用していて直ぐに問題に直面して初めてのことです。

私のタイトルが示唆するように、内部要素を含む文字列として要素全体を取得したい。

したがって、例えば以下は私のhtmlですaspnetFormを持つフォーム要素を探していaspnetForm

<html>  
<head>  
</head>  
<body>  
  <form name="aspnetForm" id="aspnetForm">
    <div id="div1">  
        <a href="div1-a1">Link 1 inside div1</a>  
        <a href="div1-a2">Link 2 inside div1</a>  
    </div>  
    <a href="a3">Link 3 outside all divs</a>      
    <div id="div2">  
        <a href="div2-a1">Link 1 inside div2</a>  
        <a href="div2-a2">Link 2 inside div2</a>  
    </div> 
  </form> 
</body>  
</html>

次のものを出力(文字列)にしたい

  <form name="aspnetForm" id="aspnetForm">
    <div id="div1">  
        <a href="div1-a1">Link 1 inside div1</a>  
        <a href="div1-a2">Link 2 inside div1</a>  
    </div>  
    <a href="a3">Link 3 outside all divs</a>      
    <div id="div2">  
        <a href="div2-a1">Link 1 inside div2</a>  
        <a href="div2-a2">Link 2 inside div2</a>  
    </div> 
  </form> 

私は通常、このようなスプーンフィードの質問をするのは好きではありませんが、私は試して検索していますが、答えを得ることができませんでした。

助けてください!

前もって感謝します!

受け入れられた回答

HtmlNode.OuterHtml探しているようです:

//
// Summary:
//     Gets or Sets the object and its content in HTML.
public virtual string OuterHtml { get; }

したがって、フォームノードを選択してOuterHtmlプロパティを取得するだけです。

HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;

更新

HAPがformタグを扱う方法には非常に古いバグがあるようです。それとも、 それは機能です!

どんな場合でも、回避策があります:

HtmlNode.ElementsFlags.Remove("form");

これはうまくいくはずです:

HtmlNode.ElementsFlags.Remove("form");
HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;

人気のある回答

確かに良い質問、次のすべてが奇妙な十分な!

HtmlAgilityPackを使用する - まだ解決策を思い付くことができません!

(私は、Cssセレクタ拡張(ScrapySharp.Extensions)を得るために、NugetライブラリScraySharpも使用することに注意してください。

 string html = @"<html>
        <head>
        </head>
        <body>
          <form name='aspnetForm' id='aspnetForm'>
            <div id='div1'>
                <a href='div1-a1'>Link 1 inside div1</a>
                <a href='div1-a2'>Link 2 inside div1</a>
            </div>
            <a href='a3'>Link 3 outside all divs</a>
            <div id='div2'>
                <a href='div2-a1'>Link 1 inside div2</a>
                <a href='div2-a2'>Link 2 inside div2</a>
            </div>
          </form>
        </body>
        </html>";

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    string result = string.Empty;

    var formElement = doc.DocumentNode.CssSelect("form").FirstOrDefault();
    var formChildren = formElement.Descendants();

    StringBuilder sb = new StringBuilder();

    if (formChildren != null)
    {
        foreach (var child in formChildren)
        {
            sb.AppendLine(child.InnerHtml);
        }
    }

        //formElement.InnerHtml also returns empty !
        Console.WriteLine(sb.ToString());

しかし、AngleSharp(これはHtmlAgility Packではなく、まだ保守・開発されているため、最近は角度のシャープが推奨されるオプションのようです)では、これを簡単に実現できます。

AngleSharpを使用する - 作品

 HtmlParser parser = new HtmlParser();
 var parsedDoc = parser.Parse(html);
 Console.WriteLine(parsedDoc.QuerySelector("form").InnerHtml);

出力(AngleSharpを使用):

ここに画像の説明を入力



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ