Einzelne Datenelemente aus HTML-Tabellen mit C # analysieren?

c# html-agility-pack web-scraping

Frage

Ich habe diesen Code in meiner Hauptfunktion und ich möchte nur die erste Zeile der Tabelle analysieren (zB 7. November 2017 73.78 74.00 72.32 72.71 17245.947).

Ich habe einen Knoten erstellt, der nur die erste Zeile abschließt, aber wenn ich mit dem Debuggen beginne, ist der Wert des Knotens null. Wie kann ich diese Daten analysieren und zum Beispiel in einer Zeichenkette oder in einzelnen Variablen speichern? Gibt es einen Weg?

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

Akzeptierte Antwort

Es scheint, dass Ihre Auswahl XPath-Zeichenfolge Fehler aufweist. Da tbody ein generierter Knoten ist, sollte er nicht im Pfad enthalten sein:

//*[@id=\"prices\"]/table/tr[2]

Während dies den Wert lesen sollte, trifft HtmlAgilityPack auf ein anderes malformed html . Alle <tr> und <td> -Knoten im geparsten Text haben keine entsprechenden schließenden Tags </tr> oder </td> und HtmlAgitiabilityPack kann keine Werte aus der Tabelle mit ungültigen Zeilen auswählen. Daher ist es notwendig, im ersten Schritt die gesamte Tabelle auszuwählen:

//*[@id=\"prices\"]/table

Und im nächsten Schritt bereinigen Sie entweder HTML durch Hinzufügen von </tr> und </td> schließenden Tags und wiederholen das Parsen mit korrigierter Tabelle oder verwenden extrahierte Strings, um sie zu analysieren - einfach die Zeilen 10 bis 15 aus der Tabellenfolge extrahieren und sie aufteilen > Charakter. Rohparsing wird unten gezeigt. Code ist getestet und funktioniert.

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum