Frage

Ich mag das HTML Agility Pack verwenden, um Tabellen von komplexen Web-Seiten zu analysieren, aber ich bin irgendwie in dem Objektmodell verloren.

ich auf dem Link Beispiel gesucht, aber fand keine Tabellendaten auf diese Weise. Kann ich XPath verwenden, um die Tabellen zu bekommen? Ich bin im Grunde verloren, nachdem die Daten geladen zu haben, wie die Tabellen zu erhalten. Ich habe dies vor in Perl getan und es war ein wenig ungeschickt, aber gearbeitet. (HTML::TableParser).

Ich bin auch glücklich, wenn man nur ein Licht auf dem richtigen Objekt, um für das Parsing vergießen.

War es hilfreich?

Lösung

Wie wäre es so etwas wie: Mit HTML Agility Pack-

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) {
    Console.WriteLine("Found: " + table.Id);
    foreach (HtmlNode row in table.SelectNodes("tr")) {
        Console.WriteLine("row");
        foreach (HtmlNode cell in row.SelectNodes("th|td")) {
            Console.WriteLine("cell: " + cell.InnerText);
        }
    }
}

Beachten Sie, dass es schönere mit LINQ-to-Objects machen können, wenn Sie wollen:

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
            from row in table.SelectNodes("tr").Cast<HtmlNode>()
            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
            select new {Table = table.Id, CellText = cell.InnerText};

foreach(var cell in query) {
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText);
}

Andere Tipps

Die einfachste, was ich gefunden habe, die XPath für ein bestimmtes Element zu erhalten, ist Firebug-Erweiterung für Firefox finden Sie auf der Website / Homepage zu drücken F12 installieren Firebug zu bringen; rechts wählen und rechts auf das Element auf der Seite, die Sie abfragen möchten, und wählen Sie „Inspect Element“ Firebug wird das Element in seiner IDE wählt dann rechts das Element in Firebug klicken und „Copy XPath“ Mit dieser Funktion kann die genaue XPath wählen geben Abfrage, die Sie brauchen, um das Element erhalten Sie wollen mit Hilfe von HTML Agility-Bibliothek.

Ich weiß, dass dies eine ziemlich alte Frage, aber das war meine Lösung, die mit Visualisierungen der Tabelle geholfen, so dass Sie eine Klassenstruktur zu schaffen. Dies wird auch mit dem HTML-Agility-Pack

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
var table = doc.DocumentNode.SelectSingleNode("//table");
var tableRows = table.SelectNodes("tr");
var columns = tableRows[0].SelectNodes("th/text()");
for (int i = 1; i < tableRows.Count; i++)
{
    for (int e = 0; e < columns.Count; e++)
    {
        var value = tableRows[i].SelectSingleNode($"td[{e + 1}]");
        Console.Write(columns[e].InnerText + ":" + value.InnerText);
    }
Console.WriteLine();
}

In meinem Fall gibt es eine einzige Tabelle, die eine Geräteliste von einem Router sein geschieht. Wenn Sie die Tabelle mit TR / TH / TD (Zeile, Header, Daten) anstelle einer Matrix lesen möchten, wie oben erwähnt, können Sie so etwas wie die folgenden tun:

    List<TableRow> deviceTable = (from table in document.DocumentNode.SelectNodes(XPathQueries.SELECT_TABLE)
                                       from row in table?.SelectNodes(HtmlBody.TR)
                                       let rows = row.SelectSingleNode(HtmlBody.TR)
                                       where row.FirstChild.OriginalName != null && row.FirstChild.OriginalName.Equals(HtmlBody.T_HEADER)
                                       select new TableRow
                                       {
                                           Header = row.SelectSingleNode(HtmlBody.T_HEADER)?.InnerText,
                                           Data = row.SelectSingleNode(HtmlBody.T_DATA)?.InnerText}).ToList();
                                       }  

TableRow ist nur ein einfaches Objekt mit Kopf- und Daten als Eigenschaften. Der Ansatz kümmert sich um Null-ness und diesen Fall:

<tr>
    <td width="28%">&nbsp;</td>
</tr>

das ist Folge ohne Header. Das Htmlbody-Objekt mit den Konstanten aus der es hängen wahrscheinlich leicht ableiten, aber ich entschuldige mich noch für sie selbst. Ich kam aus der Welt, wo, wenn Sie "in Ihrem Code haben, sollte es entweder konstant oder lokalisierbar sein.

Zeile von oben Antwort:

HtmlDocument doc = new HtmlDocument();

Das funktioniert nicht in VS 2015 C #. Sie können keine HtmlDocument mehr konstruieren.

Ein weiteres MS „Feature“, dass die Dinge schwieriger zu bedienen ist. Versuchen Sie HtmlAgilityPack.HtmlWeb und Check-out diesen Link für einige Beispielcode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top