سؤال

وأريد أن استخدام رشاقة HTML حزمة تحليل الجداول من صفحات الويب المعقدة، ولكن أنا فقدت بطريقة أو بأخرى في طراز كائن.

ونظرت المثال رابط، لكنها لم تجد أي بيانات الجدول بهذه الطريقة. هل يمكنني استخدام كسباث للحصول على الجداول؟ انا ضائعة أساسا بعد تحميل البيانات عن كيفية الحصول على الجداول. وقد فعلت ذلك في بيرل قبل وكان أخرق بعض الشيء، ولكن عملت. (HTML::TableParser).

ويسعدني أيضا إذا كان أحد يمكن أن تلقي مجرد ضوء على ترتيب الكائن المناسب للتحليل.

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

المحلول

وماذا عن شيء من هذا القبيل: باستخدام HTML أجيليتي حزمة

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

لاحظ أنه يمكنك جعلها أجمل مع LINQ إلى كائنات إذا كنت تريد:

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

نصائح أخرى

وهذا أبسط ما وجدتها للحصول على كسباث لعنصر معين هو لتثبيت تمديد Firebug ل فايرفوكس الذهاب إلى F12 الموقع / صفحة ويب الصحافة لإحضار الحرائق. حق اختيار وانقر على الحق في العنصر على الصفحة التي تريد الاستعلام وحدد "فحص العنصر" الحرائق سوف تختار عنصر في IDE لها ثم انقر على الحق في العنصر في الحرائق واختيار "نسخ كسباث" وهذه وظيفة تعطيك المحدد كسباث الاستعلام تحتاج إلى الحصول على العنصر الذي تريد استخدام المكتبة أجيليتي HTML.

وأعرف أن هذا هو السؤال القديم جدا ولكن هذا كان الحل الذي ساعد مع تصور الجدول بحيث يمكنك إنشاء البنية الطبقية. وهذا هو أيضا باستخدام أجيليتي حزمة HTML

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();
}

في حالتي، هناك جدول واحد والذي يحدث أن تكون قائمة الجهاز من جهاز التوجيه. إذا كنت ترغب في قراءة الجدول باستخدام TR / TH / TD (صف، رأس، البيانات) بدلا من مصفوفة على النحو المذكور أعلاه، يمكنك أن تفعل شيئا مثل ما يلي:

    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 هو مجرد كائن بسيط مع رأس وبيانات عن خصائص. نهج يعتني خالية نيس وهذه الحالة:

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

والذي هو التوالي دون رأس. الكائن HtmlBody مع الثوابت تتدلى منه ربما يتم استخلاصه بسهولة ولكن أعتذر عن ذلك حتى لا يزال. جئت من العالم حيث إذا كان لديك "في التعليمات البرمجية الخاصة بك، يجب أن تكون إما ثابتة أو القابلة للترجمة.

والخط من فوق الجواب:

HtmlDocument doc = new HtmlDocument();

وهذا لا يعمل في VS 2015 C #. لا يمكنك بناء على HtmlDocument أي أكثر من ذلك.

وآخر MS "ميزة" أن يجعل الأمور أكثر صعوبة للاستخدام. محاولة HtmlAgilityPack.HtmlWeb وتحقق من هذا الرابط بالنسبة لبعض نموذج التعليمات البرمجية.

scroll top