Récupère l'intégralité de l'élément de formulaire sous forme de chaîne à l'aide de HTML Agility Pack

c# html-agility-pack

Question

C'est la première fois que j'utilise Html Agility Pack et que je rencontre des problèmes immédiatement.

Tout comme mon titre l'indique, je souhaite obtenir un élément entier sous forme de chaîne, y compris des éléments internes.

Ainsi, par exemple, ci-dessous est mon code HTML et je recherche un élément de formulaire avec l'ID 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>

Je veux que ce qui suit soit la sortie (en chaîne)

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

D'habitude, je n'aime pas poser de telles questions sur l'alimentation à la cuillère, mais j'ai essayé et cherché mais je n'ai pas pu obtenir de réponse.

S'il vous plaît aider!

Merci d'avance!

Réponse acceptée

On dirait que vous recherchez HtmlNode.OuterHtml :

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

Il vous suffit donc de sélectionner votre nœud de formulaire et d'obtenir sa propriété OuterHtml:

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

METTRE À JOUR

Il semble qu'il y ait un très vieux problème avec la façon dont HAP traite les balises de form . Ou peut-être que c'est une fonctionnalité !

En tout cas, voici une solution de contournement:

HtmlNode.ElementsFlags.Remove("form");

Donc, cela devrait fonctionner:

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

Réponse populaire

En effet bonne question, assez bizarre tout ce qui suit échoue!

Utiliser HtmlAgilityPack - pas encore en mesure de trouver une solution!

(Notez que j'utilise également la bibliothèque de nugets ScraySharp pour obtenir l'extension des sélecteurs Css (ScrapySharp.Extensions).

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

Vous pouvez toutefois y parvenir - beaucoup plus facilement - avec AngleSharp (l’angle d’aigus semble être l’option recommandée ces jours-ci, car il est toujours maintenu / développé, alors que HtmlAgility Pack ne le permet pas).

Utiliser AngleSharp - fonctionne

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

Sortie (en utilisant AngleSharp):

entrez la description de l'image ici



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi