HTML Agility Pack - Saisir le texte après un nœud

c# html html-agility-pack

Question

J'ai du HTML que j'analyse en utilisant C #

L'exemple de texte est ci-dessous, bien qu'il soit répété environ 150 fois avec des enregistrements différents

<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>

J'essaie d'obtenir le texte dans un tableau qui sera comme

customerArray [0,0] = Title
customerArray [0,1] = Mr
customerArray [1,0] = First Name
customerArray [1,1] = Fake
customerArray [2,0] = Surname
customerArray [2,1] = Guy

Je peux obtenir le texte dans le tableau, mais je ne parviens pas à obtenir le texte après l'onglet de fermeture STRONG jusqu'à la balise BR, puis à trouver la prochaine balise STRONG

Toute aide serait appréciée

Réponse acceptée

Vous pouvez utiliser XPath following following-sibling::text()[1] pour obtenir le nœud de texte situé directement après chaque strong . Voici un exemple minimal mais complet:

var raw = @"<div>
<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
        </div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//strong"))
{
    var val = node.SelectSingleNode("following-sibling::text()[1]");
    Console.WriteLine(node.InnerText + ", " + val.InnerText);
}

dotnetfiddle demo

sortie:

Title, : Mr
First name, : Fake
Surname, : Guy

Vous devriez pouvoir supprimer le ":" en faisant une simple manipulation de chaîne, si nécessaire ...


Réponse populaire

<strong> est une balise commune, donc quelque chose de spécifique pour l'exemple de format que vous avez fourni

var html = @"
<div>
<strong>First name</strong><em>italic</em>: Fake<br>
<strong>Bold</strong> <a href='#'>hyperlink</a><br>.
<strong>bold</strong>
<strong>bold</strong> <br>
text
</div>

<div>
<strong>Title</strong>: Mr<BR>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
</div>";

var document = new HtmlDocument();
document.LoadHtml(html);
// 1. <strong>
var strong = document.DocumentNode.SelectNodes("//strong");
if (strong != null)
{
    foreach (var node in strong.Where(
        // 2. followed by non-empty text node
        x => x.NextSibling is HtmlTextNode
        && !string.IsNullOrEmpty(x.NextSibling.InnerText.Trim())
        // 3. followed by <br>
        && x.NextSibling.NextSibling is HtmlNode
        && x.NextSibling.NextSibling.Name.ToLower() == "br"))
    {
        Console.WriteLine("{0} {1}", node.InnerText, node.NextSibling.InnerText);
    }
}


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