Parsen von HTML mit Agility Pack

c# html html-agility-pack parsing

Frage

Ich habe einen HTML zu parsen (siehe unten)

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

Ich muss Links in <tr onclick= Tags und E-Mail-Adressen in <td> -Tags analysieren.

Bisher habe ich versucht, das erste Vorkommen von E-Mail / Link von meinem HTML zu bekommen.

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

Könnte mir jemand zeigen, wie es richtig gemacht wird? Grundsätzlich möchte ich alle E-Mail-Adressen und Links von HTML, die in den Tags sind.

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

EDIT: Ich muss geparste Werte in einer Klasse (Liste) paarweise speichern. E-Mail (Link) und Absender E-Mail.

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

}

Akzeptierte Antwort

Sie können den folgenden Code schreiben:

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

Um diesen Code einfach zu halten, nehme ich einige Dinge an:

  1. Die E-Mail befindet sich immer auf der ersten td innerhalb des tr, die eine Onlink-Eigenschaft enthält
  2. Jeder tr mit einem Onlink-Attribut enthält eine E-Mail

Wenn diese Bedingungen nicht zutreffen, funktioniert dieser Code nicht und es könnten einige Ausnahmen ausgelöst werden (IndexOutOfRangeExceptions) oder Links mit falschen E-Mail-Adressen gefunden werden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum