HTML Agility Pack - PullRequest
       14

HTML Agility Pack

3 голосов
/ 12 марта 2010

У меня есть HTML-таблицы на одной веб-странице, как

<table border=1>
    <tr><td>sno</td><td>sname</td></tr>
    <tr><td>111</td><td>abcde</td></tr>
    <tr><td>213</td><td>ejkll</td></tr>
</table>

<table border=1>
    <tr><td>adress</td><td>phoneno</td><td>note</td></tr>
    <tr><td>asdlkj</td><td>121510</td><td>none</td></tr>
    <tr><td>asdlkj</td><td>214545</td><td>none</td></tr>
</table>

Теперь с этой веб-страницы, используя html agility pack, я хочу извлечь данные об адресе столбца и номере телефона. Для этого сначала нужно найти, в какой таблице есть адрес столбца и phoneno. После нахождения этой таблицы я хочу извлечь данные адреса столбца и phoneno, что мне делать?

Я могу получить стол. Но после этого я ничего не понимаю.

И еще: возможно, что мы можем извлечь данные из таблицы через имя столбца.

Ответы [ 2 ]

4 голосов
/ 12 марта 2010

Вот несколько вспомогательных методов, которые помогут вам разобрать таблицы HTML в DataTable экземплярах. Вы можете просто перебрать полученный массив DataTable, чтобы найти тот, который содержит нужные вам столбцы. Код связан с форматом таблиц в HTML, в этом случае он получает информацию о столбце из первой строки (<tr>). Также обратите внимание, что проверка ошибок не выполняется, так что это приведет к разрыву таблиц, которые не соответствуют указанному вами формату.

Вспомогательные методы:

private static DataTable[] ParseAllTables(HtmlDocument doc)
{
    var result = new List<DataTable>();
    foreach (var table in doc.DocumentNode.Descendants("table"))
    {
        result.Add(ParseTable(table));
    }
    return result.ToArray();
}

private static DataTable ParseTable(HtmlNode table)
{
    var result = new DataTable();

    var rows = table.Descendants("tr");

    var header = rows.Take(1).First();
    foreach (var column in header.Descendants("td"))
    {
        result.Columns.Add(new DataColumn(column.InnerText, typeof(string)));
    }

    foreach (var row in rows.Skip(1))
    {
        var data = new List<string>();
        foreach (var column in row.Descendants("td"))
        {
            data.Add(column.InnerText);
        }
        result.Rows.Add(data.ToArray());
    }
    return result;
}

Пример использования:

public static void Main(string[] args)
{
    string html = @"
        <html><head></head>
        <body><div>
            <table border=1>
                <tr><td>sno</td><td>sname</td></tr>
                <tr><td>111</td><td>abcde</td></tr>
                <tr><td>213</td><td>ejkll</td></tr>
            </table>
            <table border=1>
                <tr><td>adress</td><td>phoneno</td><td>note</td></tr>
                <tr><td>asdlkj</td><td>121510</td><td>none</td></tr>
                <tr><td>asdlkj</td><td>214545</td><td>none</td></tr>
            </table>
        </div></body>
        </html>";

    HtmlDocument doc = new HtmlDocument();

    doc.LoadHtml(html);

   DataTable addressAndPhones;
   foreach (var table in ParseAllTables(doc))
   {
       if (table.Columns.Contains("phoneno") && table.Columns.Contains("adress"))
       {
           // You found the address and phone number table
           addressAndPhones = table;
       }
   }
}
1 голос
/ 12 марта 2010

Прокручивать таблицы и получать значения столбцов по индексу

int index = 0;
foreach(HtmlNode tablerow in table.SelectNodes("tr"))
{
    // skip the first row...
    if(index > 0)
    {
        // select first td element
        HtmlNode td1 = tablerow.SelectSingleNode("td[1]");
        if(td1 != null)
        {
            string address = td1.InnerText;
        }
    }
    index++;
}

Если вы можете изменить веб-страницу, вы можете использовать thead для текстов заголовков и tbody для фактических значений.

<table id="mytable">
    <thead><tr><td>Column1</td><td>Column2</td></tr></thead>
    <tbody>
        <tr><td>Value 1</td><td>Value 2</td></tr>
        <tr><td>Value 1</td><td>Value 2</td></tr>
    </tbody>
</table>

Тогда вам не придется пропускать первый ряд.

foreach(HtmlNode tablerow in table.SelectNodes("/table[@id=\"mytable\"]/tbody/tr"))
{
    // ...
}

Посмотрите учебник по xpath, он очень полезен для HtmlAgilityPack.

...