Comment utiliser HTML Agility Pack pour modifier un extrait de code HTML

c# html-agility-pack

Question

J'ai donc un extrait de code HTML que je souhaite modifier à l'aide de C #.

<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>

et je veux le transformer en ceci:

<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>

Je vais utiliser HTML Agility Pack en fonction des nombreuses recommandations présentées ici, mais je ne sais pas où je vais. En particulier,

  1. Comment charger un extrait de code partiel sous forme de chaîne, au lieu d'un document HTML complet?
  2. Comment éditer?
  3. Comment puis-je retourner la chaîne de texte de l'objet édité?

Réponse acceptée

  1. Identique à un document HTML complet. Ça n'a pas d'importance.
  2. Vous avez le choix entre 2 options: vous pouvez modifier directement la propriété InnerHtml (ou le Text sur les nœuds de texte) ou modifier l’arborescence des PrependChild en utilisant par exemple AppendChild , PrependChild etc.
  3. Vous pouvez utiliser la propriété HtmlDocument.DocumentNode.OuterHtml ou utiliser la méthode HtmlDocument.Save (personnellement, je préfère la deuxième option).

En ce qui concerne l'analyse, je sélectionne les nœuds de texte contenant le terme de recherche à l'intérieur de votre div , puis j'utilise string.Replace méthode string.Replace pour le remplacer:

var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]");
if (textNodes != null)
    foreach (HtmlTextNode node in textNodes)
        node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>");

Et enregistrer le résultat dans une chaîne:

var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]");
if (textNodes != null)
    foreach (HtmlTextNode node in textNodes)
        node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>");

Réponse populaire

Réponses:

  1. Il y a peut-être un moyen de faire cela mais je ne sais pas comment. Je suggère de charger le document entier.
  2. Utilisez une combinaison de XPath et d'expressions régulières
  3. Voir le code ci-dessous pour un exemple artificiel. Vous pouvez avoir d'autres contraintes non mentionnées mais cet exemple de code devrait vous aider à démarrer.

Notez que votre expression Xpath devra peut-être être plus complexe pour trouver la div que vous voulez.

HtmlDocument doc = new HtmlDocument();

doc.Load(yourHtmlFile);
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]");
string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", 
"<a class='special' href='http://etc'>specialSearchWord</a>");
divNode.InnerHtml = newDiv;
Console.WriteLine(doc.DocumentNode.OuterHtml);



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