Recupero di dati da una tabella HTML in una datatable

Ok, quindi ho bisogno di query di un sito per ottenere i dati da una tabella, mettere questa tabella HTML in una DataTable e poi utilizzare questi dati. Io finora sono riuscito a usare l’Html, Agilità Pack e XPath per ottenere per ogni riga della tabella di cui ho bisogno, ma so che ci deve essere un modo per analizzare in un DataTable. (C#) Il codice attualmente sto usando è:

string htmlCode = "";
using (WebClient client = new WebClient())
{
htmlCode = client.DownloadString("http://www.website.com");
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(htmlCode);

//My attempt at LINQ to solve the issue (not sure where to go from here)
var myTable = doc.DocumentNode
.Descendants("table")
.Where(t =>t.Attributes["summary"].Value == "Table One")
.FirstOrDefault();

//Finds all the odd rows (which are the ones I actually need but would prefer a
//DataTable containing all the rows!
foreach (HtmlNode cell in doc.DocumentNode.SelectNodes("//tr[@class='odd']/td"))
{
string test = cell.InnerText;
//Have not gone further than this yet!
}

Tabella HTML sul sito ho l’interrogazione di simile a questo:

<table summary="Table One">
<tbody>
<tr class="odd">
<td>Some Text</td>
<td>Some Value</td>
</tr>
<tr class="even">
<td>Some Text1</td>
<td>Some Value1</td>
</tr>
<tr class="odd">
<td>Some Text2</td>
<td>Some Value2</td>
</tr>
<tr class="even">
<td>Some Text3</td>
<td>Some Value3</td>
</tr>
<tr class="odd">
<td>Some Text4</td>
<td>Some Value4</td>
</tr>
</tbody>
</table>

E non so se è meglio/più facile da usare LINQ + HAP o XPath + HAP per ottenere il risultato desiderato, ho provato sia con un successo limitato, come probabilmente si può vedere. Questa è la prima volta che io abbia mai fatto un programma per la query di un sito web, o addirittura interagire con un sito web in qualsiasi modo sono molto incerto al momento! Grazie per qualsiasi aiuto in anticipo 🙂

OriginaleL’autore Jack Eker | 2012-05-09

5 Replies
  1. 4

    Esiste un metodo fuori della scatola HTML Agilità Pack, ma non dovrebbe essere troppo difficile da creare. C’è i campioni c’ che fare XML per Datatable da Linq-to-XML. Questi possono essere ri-lavorato ciò di cui ha bisogno.

    Se serve posso aiutare la creazione di tutto il metodo, ma non oggi :).

    Vedi anche:

    Grazie dopo aver dato un’occhiata a queste risorse e un paio di altri che sono riuscito a trovare un modo per farlo 😀
    Sareste disposti a condividere la vostra soluzione per il bene degli altri?
    Grazie per il suggerimento aggiunto la soluzione qui sotto!

    OriginaleL’autore jessehouwing

  2. 8

    Utilizzando alcuni di Jack Eker, del codice di cui sopra e un po ‘ di codice da Mark Gravell (vedi post qui) , sono riuscito a venire con una soluzione.
    Questo frammento di codice viene utilizzato per ottenere le festività per l’anno 2012 in Sud Africa come della scrittura di questo articolo

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Web;
    using System.Net;
    using HtmlAgilityPack;
    
    
    
    namespace WindowsFormsApplication
    {
        public partial class Form1 : Form
        {
            private DataTable dt;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                string htmlCode = "";
                using (WebClient client = new WebClient())
                {
                    client.Headers.Add(HttpRequestHeader.UserAgent, "AvoidError");
                    htmlCode = client.DownloadString("http://www.info.gov.za/aboutsa/holidays.htm");
                }
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    
                doc.LoadHtml(htmlCode);
    
                dt = new DataTable();
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Value", typeof(string));
    
                int count = 0;
    
    
                foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
                {
    
                    foreach (HtmlNode row in table.SelectNodes("tr"))
                    {
    
                        if (table.Id == "table2")
                        {
                            DataRow dr = dt.NewRow();
    
                            foreach (var cell in row.SelectNodes("td"))
                            {
                                if ((count % 2 == 0))
                                {
                                    dr["Name"] = cell.InnerText.Replace("&nbsp;", " ");
                                }
                                else
                                {
    
                                    dr["Value"] = cell.InnerText.Replace("&nbsp;", " ");
    
                                    dt.Rows.Add(dr);
                                }
                                count++;
    
                            }
    
    
                        }
    
                    }
    
    
                    dataGridView1.DataSource = dt;
    
                }
            }
    
        }
    }

    OriginaleL’autore Abide Masaraure

  3. 3

    Questa è la mia soluzione. Può essere un po ‘ disordinato, ma è perfettamente funzionante al momento 😀

    string htmlCode = "";
    using (WebClient client = new WebClient())
    {
    client.Headers.Add(HttpRequestHeader.UserAgent, "AvoidError");
    htmlCode = client.DownloadString("http://www.website.com");
    }
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    
    doc.LoadHtml(htmlCode);
    
    DataTable dt = new DataTable();
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Value", typeof(decimal));
    
    int count = 0;
    decimal rowValue = 0;
    bool isDecimal = false;
    foreach (var row in doc.DocumentNode.SelectNodes("//table[@summary='Table Name']/tbody/tr"))
    {
    DataRow dr = dt.NewRow();
    foreach (var cell in row.SelectNodes("td"))
    {
    if ((count % 2 == 0))
    {
    dr["Name"] = cell.InnerText.Replace("&nbsp;", " ");
    }
    else
    {
    isDecimal = decimal.TryParse((cell.InnerText.Replace(".", "")).Replace(",", "."), out rowValue);
    if (isDecimal)
    {
    dr["Value"] = rowValue;
    }
    dt.Rows.Add(dr);
    }
    count++;
    }
    }

    OriginaleL’autore Jack Eker

  4. 1

    Logica semplice per convertire un htmltable datatable :

    //Define your webtable
    public static HtmlTable table
                {
                    get
                    {
                        HtmlTable var = new HtmlTable(parent);
                        var.SearchProperties.Add("id", "searchId");
                        return var;
                    }
                }
    
    //Convert a webtable to datatable
    public static DataTable getTable
                {
                    get
                    {
                        DataTable dtTable= new DataTable("TableName");
                        UITestControlCollection rows = table.Rows;
                        UITestControlCollection headers = rows[0].GetChildren();
                        foreach (HtmlHeaderCell header in headers)
                        {
                            if (header.InnerText != null)
                                dtTable.Columns.Add(header.InnerText);
                        }
                        for (int i = 1; i < rows.Count; i++)
                        {
                            UITestControlCollection cells = rows[i].GetChildren();
                            string[] data = new string[cells.Count];
                            int counter = 0;
                            foreach (HtmlCell cell in cells)
                            {
                                if (cell.InnerText != null)
                                    data[counter] = cell.InnerText;
                                counter++;
                            }
                            dtTable.Rows.Add(data);
                        }
                        return dtTable;
                    }
                }

    OriginaleL’autore Shankar Acharya

  5. 0

    Si può provare

        DataTable.Rows[i].Cells[j].InnerText;

    Dove DataTable è l’id della tabella, i è la riga e la j è l’cellule.

    OriginaleL’autore Kent Ong

Lascia un commento