J'ai ce code dans ma fonction principale et je souhaite analyser uniquement la première ligne du tableau (par exemple, le 7 novembre 2017, 73,78 74,00 72,32, 72,71 17 245 947).
J'ai créé un nœud qui ne termine que la première ligne, mais lorsque je commence à déboguer, la valeur du nœud est null. Comment puis-je analyser ces données et les stocker par exemple dans une chaîne ou dans des variables simples. Y a-t-il un moyen?
WebClient web = new WebClient();
string page = web.DownloadString("https://finance.google.com/finance/historical?q=NYSE:C&ei=7O4nV9GdJcHomAG02L_wCw");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(page);
var node = doc.DocumentNode.SelectSingleNode("//*[@id=\"prices\"]/table/tbody/tr[2]");
List<List<string>> node = doc.DocumentNode.SelectSingleNode("//*[@id=\"prices\"]/table").Descendants("tr").Skip(1).Where(tr => tr.Elements("td").Count() > 1).Select(tr => tr.Elements("td").Select(td=>td.InnerText.Trim()).ToList()).ToList() ;
Il semble que votre chaîne XPath de sélection comporte des erreurs. Puisque tbody
est un noeud généré, il ne devrait pas être inclus dans le chemin:
//*[@id=\"prices\"]/table/tr[2]
Alors que cela devrait lire la valeur HtmlAgilityPack frappe un autre problème malformed malformed html
. Tous les nœuds <tr>
et <td>
dans le texte analysé n'ont pas de balises fermantes </tr>
ou </td>
et HtmlAgitilityPack ne parvient pas à sélectionner les valeurs d'une table avec des lignes mal formées. Par conséquent, il est nécessaire de sélectionner dans un premier temps l’ensemble du tableau:
//*[@id=\"prices\"]/table
Et à l'étape suivante, désinfectez HTML en ajoutant </tr>
et </td>
balises de fermeture et répétez l'analyse avec la table corrigée, ou utilisez la chaîne extraite pour l'analyser à la main >
personnage. L'analyse brute est présentée ci-dessous. Le code est testé et fonctionne.
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace GoogleFinanceDataScraper
{
class Program
{
static void Main(string[] args)
{
WebClient web = new WebClient();
string page = web.DownloadString("https://finance.google.com/finance/historical?q=NYSE:C&ei=7O4nV9GdJcHomAG02L_wCw");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(page);
var node = doc.DocumentNode.SelectSingleNode("//div[@id='prices']/table");
string outerHtml = node.OuterHtml;
List<String> data = new List<string>();
using(StringReader reader = new StringReader(outerHtml))
{
for(int i = 0; ; i++)
{
var line = reader.ReadLine();
if (i < 9) continue;
else if (i < 15)
{
var dataRawArray = line.Split(new char[] { '>' });
var value = dataRawArray[1];
data.Add(value);
}
else break;
}
}
Console.WriteLine($"{data[0]}, {data[1]}, {data[2]}, {data[3]}, {data[4]}, {data[5]}");
}
}
}