HtmlAgilityPack comment extraire du HTML entre des balises

c# html-agility-pack

Question

Je dois extraire tout le paragraphe d'un html et aussi tout le texte entre ces balises.

ce code ne fonctionne pas lorsque le texte analysé dans HtmlDocument est modifié par rapport à celui d'origine. Dans l'échantillon

some <br />text

est changé dans

some <br>text

es:

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
int lastPos = -1;
foreach (HtmlAgilityPack.HtmlNode n in nodes)
{
  if (lastPos > -1)
  {
      string textNotInP = Doc.DocumentNode.OuterHtml.Substring(lastPos, n.StreamPosition - lastPos);
                System.Diagnostics.Debug.WriteLine(textNotInP);
 }
 System.Diagnostics.Debug.WriteLine(n.OuterHtml);
 lastPos = n.StreamPosition + n.OuterHtml.Length;
}

le résultat correct serait:

<p>firt paragraph</p>
some <br>text
<p>second paragraph</p>
<span>some text between span</span>
<p>third paragraph</p>

mais le code ci-dessus renvoie ceci:

<p>firt paragraph</p>
some <br>text<p
<p>second paragraph</p>
pan>some text between span</span><p
<p>third paragraph</p>

la raison en est que steamPosition renvoie la position du nœud associée au texte d'origine, et non celle analysée dans htmlDocument.

Existe-t-il un moyen de renvoyer la position d’un nœud associé au code HTML analysé?

Réponse acceptée

Vous pouvez utiliser la propriété OuterHtml de chaque élément <p> pour obtenir le code HTML souhaité:

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

sortie:

<p>firt paragraph</p>
<p>another paragraph</p>
<p>hellow word</p>

Ou si vous voulez tout obtenir entre le premier <p> et le dernier <p> éléments inclus, vous pouvez utiliser le XPath suivant:

var query = "//node()[preceding-sibling::p or self::p][following-sibling::p or self::p]";

Le grappin XPath tous les noeuds (soit l' élément ou noeud de texte) , que: a la précèdent fratrie p et en suivant les frères et sœurs p , ou le nœud lui - même est un p élément.

var nodes = doc.DocumentNode.SelectNodes(query);
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

sortie:

<p>firt paragraph</p>
some
<br />
text
<p>another paragraph</p>
<span>some text between span</span>
<p>hellow word</p>


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