Analyser le code HTML à l'aide du pack d'agilité

c# html html-agility-pack parsing

Question

J'ai un code HTML à analyser (voir ci-dessous)

<div id="mailbox" class="div-w div-m-0">
    <h2 class="h-line">InBox</h2>
    <div id="mailbox-table">
        <table id="maillist">
            <tr>
                <th>From</th>
                <th>Subject</th>
                <th>Date</th>
            </tr>
            <tr onclick="location='readmail.html?mid=welcome'" style="font-weight: bold;">
                <td>no-reply@somemail.net</td>
                <td>
                    <a href="readmail.html?mid=welcome">Hi, Welcome</a>
                </td>
                <td>
                    <span title="2016-02-16 13:23:50 UTC">just now</span>
                </td>
            </tr>
            <tr onclick="location='readmail.html?mid=T0wM6P'" style="font-weight: bold;">
                <td>someone@outlook.com</td>
                <td>
                    <a href="readmail.html?mid=T0wM6P">sa</a>
                </td>
                <td>
                    <span title="2016-02-16 13:24:04">just now</span>
                </td>
            </tr>
        </table>
    </div>
</div>

J'ai besoin d'analyser les liens dans les balises <tr onclick= et les adresses électroniques dans les balises <td> .

Jusqu'à présent, j'ai réussi à obtenir la première occurrence d'email / lien de mon HTML.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(responseFromServer);

Est-ce que quelqu'un pourrait me montrer comment c'est fait correctement? Fondamentalement, ce que je veux faire est de prendre toutes les adresses e-mail et les liens de HTML qui sont dans ces balises.

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]"))
{
    HtmlAttribute att = link.Attributes["onclick"];
    Console.WriteLine(att.Value);
}

EDIT: Je dois stocker les valeurs analysées dans une classe (liste) par paires. Email (lien) et email de l'expéditeur.

public class ClassMailBox
{
    public string From { get; set; } 
    public string LinkToMail { get; set; }    

}

Réponse acceptée

Vous pouvez écrire le code suivant:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(responseFromServer);

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]"))
{
    HtmlAttribute att = link.Attributes["onclick"];
    ClassMailBox classMailbox = new ClassMailBox() { LinkToMail = att.Value };
    classMailBoxes.Add(classMailbox);
}

int currentPosition = 0;

foreach (HtmlNode tableDef in doc.DocumentNode.SelectNodes("//tr[@onclick]/td[1]"))
{
    classMailBoxes[currentPosition].From = tableDef.InnerText;
    currentPosition++;
}

Pour garder ce code simple, je suppose certaines choses:

  1. L'email est toujours sur le premier td à l'intérieur du tr qui contient une propriété onlink
  2. Chaque tr avec un attribut onlink contient un email

Si ces conditions ne s'appliquent pas, ce code ne fonctionnera pas et pourrait générer des exceptions (IndexOutOfRangeExceptions) ou faire correspondre des liens avec des adresses électroniques erronées.



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