Разбор html с использованием пакета маневренности

c# html html-agility-pack parsing

Вопрос

У меня есть html для разбора (см. Ниже)

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

Мне нужно разбирать ссылки в тегах <tr onclick= и адресах электронной почты в тегах <td> .

До сих пор мне удалось получить первое сообщение электронной почты / ссылки из моего html.

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

Может ли кто-нибудь показать мне, как это правильно сделано? В основном, что я хочу сделать, это взять все адреса электронной почты и ссылки из html, которые находятся в указанных тегах.

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

EDIT: Мне нужно сохранить анализируемые значения в классе (списке) попарно. Электронная почта (ссылка) и отправители электронной почты.

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

}

Принятый ответ

Вы можете написать следующий код:

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

Чтобы этот код был прост, я принимаю некоторые вещи:

  1. Электронная почта всегда находится на первом td внутри tr, который содержит свойство onlink
  2. Каждый tr с атрибутом onlink содержит электронное письмо

Если эти условия не применяются, этот код не будет работать и может вызвать некоторые исключения (IndexOutOfRangeExceptions) или он может соответствовать ссылкам с неправильными адресами электронной почты.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему