Conversion d'un tableau HTML en fichier CSV à l'aide de HTML Agility Pack

c# csv html-agility-pack linq

Question

Je veux obtenir tous les éléments d'une table avec id = statsTable et je veux toutes les données que je peux ensuite lire dans un csv.

Voici ce que j'ai jusqu'à présent:

// Create a request for the URL. 
WebRequest request = WebRequest.Create("http://www.pgatour.com/stats/stat.120.html");
Console.WriteLine("Requesting data from: http://www.pgatour.com/stats/stat.120.html");

// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;

WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
    StreamReader reader = new StreamReader(stream);

    // covert html to string
    String responseString = reader.ReadToEnd();

    HtmlDocument doc = new HtmlDocument();

    doc.LoadHtml(responseString);

    var desktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    var fullFileName = Path.Combine(desktopFolder, "GolfStats.csv");

    using (var PlayerFile = new StreamWriter(fullFileName))
    {
        PlayerFile.WriteLine("Data downloaded: " + DateTime.Now);

        var myTable = doc.DocumentNode
                        .Descendants("table")
                        .Where(table => table.Attributes.Contains("id"))
                        .SingleOrDefault(table => table.Attributes["id"].Value == "statsTable");

        var myTableValues = myTable.Descendants("td");

        foreach (var tdV in myTableValues)
        {
            PlayerFile.WriteLine(tdV.InnerText);
            Console.WriteLine(tdV.InnerText);
        }

        PlayerFile.Flush();
    }
}

Le problème est que mon csv ne fait que répertorier les données dans une seule colonne, tout en sélectionnant une annonce placée dans la table (voir URL dans la requête Web). Si vous pouviez m'aider à sortir les données sous forme de tableau, ce serait superbe!

Réponse acceptée

Vous créez une nouvelle ligne pour chaque cellule du tableau. Pour le changer afin que chaque ligne du tableau ait une ligne séparée, remplacez

var myTableValues = myTable.Descendants("td");
foreach (var tdV in myTableValues)
{
    PlayerFile.WriteLine(tdV.InnerText);
    Console.WriteLine(tdV.InnerText);
}

avec

var myTableRows = myTable.Descendants("tr").Where(tr => tr.Attributes.Contains("id"));
foreach (var tr in myTableRows)
{
    string line = string.Join(";", tr.Descendants("td").Select(td => td.InnerText));
    PlayerFile.WriteLine(line);
    Console.WriteLine(line);
}

Le .Where(tr => tr.Attributes.Contains("id")) filtre l'annonce dès que la ligne du tableau avec l'annonce n'a pas d'identifiant alors que toutes les lignes du joueur en ont.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow