Parsing html con l'agility pack

c# html html-agility-pack parsing

Domanda

Ho un codice HTML da analizzare (vedi sotto)

<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>

Devo analizzare i collegamenti in <tr onclick= tag e indirizzi email nei tag <td> .

Finora sono riuscito a ottenere il primo rapporto di email / link dal mio html.

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

Qualcuno potrebbe mostrarmi come è fatto correttamente? Fondamentalmente quello che voglio fare è prendere tutti gli indirizzi email e i link da html che sono in detti tag.

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

EDIT: Ho bisogno di memorizzare valori analizzati in una classe (lista) in coppia. Email (link) e mittenti Email.

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

}

Risposta accettata

Puoi scrivere il seguente codice:

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++;
}

Per mantenere questo codice semplice, sto assumendo alcune cose:

  1. L'email è sempre sul primo td all'interno del tr che contiene una proprietà onlink
  2. Ogni tr con un attributo onlink contiene un'email

Se tali condizioni non si applicano, questo codice non funzionerà e potrebbe generare alcune eccezioni (IndexOutOfRangeExceptions) oppure potrebbe corrispondere a link con indirizzi email errati.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché