سؤال

لدي جداول 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 أريد استخراج بيانات عنوان العمود والهاتف لا فقط. وهذا يعني أنه قد أجد أولا في أي طاولة هناك عنوان عمود و phoneno.after في العثور على هذا الجدول الذي أريد استخراج بيانات عنوان العمود هذا ويفونينو ماذا أفعل؟

يمكنني الحصول على الجدول. ولكن بعد ذلك ما يجب أن أفعله لا أفهم.

والشيء الآخر: ممكن أن نتمكن من استخراج البيانات من الجدول من خلال اسم العمود.

هل كانت مفيدة؟

المحلول

فيما يلي بعض طرق المساعد لمساعدتك في تحليل طاولات 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;
       }
   }
}

نصائح أخرى

حلقة من خلال Tablerows والحصول على قيم العمود حسب الفهرس

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، إنه مفيد للغاية مع HTMLAGIMEPACK.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top