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 <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> 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,
InnerHtml
(ou le Text
sur les nœuds de texte) ou modifier l’arborescence des PrependChild
en utilisant par exemple AppendChild
, PrependChild
etc. 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:
string result = null;
using (StringWriter writer = new StringWriter())
{
doc.Save(writer);
result = writer.ToString();
}
Réponses:
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);