HTML Agility pack - parsowanie tabel

Chcę użyć Html agility pack do analizowania tabel ze złożonych stron internetowych, ale jestem jakoś zagubiony w modelu obiektowym.

Spojrzałem na przykład łącza, ale nie znalazłem żadnych danych tabeli w ten sposób. Czy Mogę użyć XPath, aby uzyskać tabele? Jestem w zasadzie zagubiony po załadowaniu danych, jak uzyskać tabele. Robiłem to już wcześniej w Perlu i było to trochę niezdarne, ale działało. (HTML::TableParser).

Cieszę się również, jeśli można rzucić światło na właściwą kolejność obiektów dla parsowanie.

Author: Nathaniel Ford, 2009-03-17

4 answers

Może coś w rodzaju: Korzystanie z 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);
        }
    }
}

Zauważ, że możesz uczynić go ładniejszym z LINQ-to-Objects jeśli chcesz:

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);
}
 104
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 17:52:37

Najprostszym, co znalazłem, aby uzyskać XPath dla konkretnego elementu jest zainstalowanie rozszerzenia FireBug dla Firefoksa przejdź do witryny/strony internetowej naciśnij F12, aby wywołać firebug; prawy wybierz i kliknij prawym przyciskiem myszy element na stronie, którą chcesz zapytać i wybierz "Inspect Element" Firebug wybierze element w swoim IDE, a następnie kliknij prawym przyciskiem myszy Element w Firebug i wybierz "Copy XPath" ta funkcja da Ci dokładne zapytanie XPath, którego potrzebujesz, aby uzyskać element, którego chcesz użyć Biblioteka.

 31
Author: Coda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 17:33:23

Linia z góry odpowiedź:

HtmlDocument doc = new HtmlDocument();
To nie działa w VS 2015 C#. Nie można już konstruować HtmlDocument.

Kolejna "funkcja" MS, która sprawia, że rzeczy są trudniejsze w użyciu. Spróbuj HtmlAgilityPack.HtmlWeb i sprawdź ten link , aby uzyskać przykładowy kod.

 0
Author: rk42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 02:37:14

W moim przypadku istnieje pojedyncza tabela, która jest listą urządzeń z routera. Jeśli chcesz odczytać tabelę za pomocą tr / th / td (wiersz, nagłówek, dane) zamiast macierzy, jak wspomniano powyżej, możesz zrobić coś takiego:

    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 jest po prostu prostym obiektem z nagłówkiem i danymi jako właściwościami. Podejście zajmuje się null-ness i w tym przypadku:

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

Czyli wiersz bez nagłówka. Obiekt HtmlBody ze stałymi wiszącymi poza tym są prawdopodobnie łatwo wydedukować, ale przepraszam za to nawet nadal. Pochodzę ze świata, w którym jeśli masz " w swoim kodzie, powinien być stały lub lokalizowalny.

 0
Author: Shibumi Tait,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 03:51:22