Analizando html usando el paquete de agilidad

c# html html-agility-pack parsing

Pregunta

Tengo un html para analizar (ver más abajo)

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

Necesito analizar los enlaces en las etiquetas <tr onclick= y las direcciones de correo electrónico en las etiquetas <td> .

Hasta ahora he logrado obtener mi primer correo electrónico / enlace desde mi html.

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

¿Podría alguien mostrarme cómo se hace correctamente? Básicamente, lo que quiero hacer es tomar todas las direcciones de correo electrónico y enlaces de html que están en dichas etiquetas.

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

EDITAR: Necesito almacenar valores analizados en una clase (lista) en pares. Correo electrónico (enlace) y correo electrónico de remitentes.

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

}

Respuesta aceptada

Puedes escribir el siguiente código:

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

Para mantener este código simple, estoy asumiendo algunas cosas:

  1. El correo electrónico está siempre en la primera td dentro de tr que contiene una propiedad onlink
  2. Cada tr con un atributo onlink contiene un correo electrónico

Si esas condiciones no se aplican, este código no funcionará y podría generar algunas excepciones (IndexOutOfRangeExceptions) o podría hacer coincidir los enlaces con direcciones de correo electrónico incorrectas.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué