Laden...

Wie kann ich eine HTML-Datei lesen, filtern und bestimmte Teile in eine Excel Tabelle schreiben?

Erstellt von Demokrit vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.762 Views
D
Demokrit Themenstarter:in
10 Beiträge seit 2018
vor 5 Jahren
Wie kann ich eine HTML-Datei lesen, filtern und bestimmte Teile in eine Excel Tabelle schreiben?

Hallo,

Ich habe eine Frage da ich im Moment nicht weiterkomme.
Mein Ziel ist es eine HTML-Datei zu lesen, sie zu filtern und dann bestimmte Teile davon in eine Excel Tabelle zu schreiben. Komischerweise hab ich das Filtern und das speichern in die Excel Tabelle hinbekommen aber habe Probleme mit dem Filtern der HTML-Datei.

Folgendes soll passieren:

-> HTML Datei soll gelesen werden aber NUR teile die Zwischen <td und </td> tags stehen sollen, sollen in einen string gespeichert werden. (In dem folgenden Fall sollte nur: <td Test </td> gespeichert werden. (12353 <td Text </td>124))
-> Nachdem man dann einen String von vielen <td ___ </td> Zeilen hat, sollen diese durch ein Komma getrennt werden, da viele Leerzeichen dazwischen sind (Ich war schon ein paar mal nah dran)

Wie gesagt das filtern in die Excel Tabelle habe ich schon fertig aber egal welche lösung ich probiert habe, ich habe nicht die richtigen Strings rausbekommen. Folgendes habe ich probiert:


    class Program
    {
        static void Main(string[] args)
        {
            string line = "";
            string FilteredHTML = "";
            bool test = false;


            using (StreamReader Reader = new StreamReader(@"C:\Users\xxxx\Desktop\Projekt Tabellen Import\0as.HTML"))
            {
                while ((line = Reader.ReadLine()) != null)
                {
                    if (line.Contains("<td") || test == true)
                    {
                        {
                            FilteredHTML += line;
                            test = true;
                        }

                    }
                    if (line.Contains("</td>"))
                    {
                        {
                            FilteredHTML += line;
                            test = false;
                        }              
                    }
                }
            }
            Console.WriteLine(FilteredHTML);
            Console.ReadKey();
        }
    }

Hier kommen falsche Lösungen Raus weil nach einem </td> eigentlich nur ein <td stehen dürfte weil nach dem </td> ja aufgehört werden soll zu speichern und erst ab einem <td wieder angefangen werden soll.

Außerdem hab ich noch versucht den gesamten HTML text mit File.ReadAllText zu lesen und so zu filtern aber das hat auch nicht wirklich funktioniert.

Das Splitten der <td </td> "Teile" sollte ich eigentlich auch hinbekommen also eigentlich ist das Problem nur das speichern von den Teilen.

M
184 Beiträge seit 2012
vor 5 Jahren

Post mal bitte ein Beispiel-HTML Markup.
Laut deiner Beschreibung ist das kein valides HTML.

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

ich kann dir nur abraten zu versuchen selbst HTML zu parsen. Das fehlerfrei zu bauen erfordert deutlich mehr Aufwand als schlicht ein Paket zu verwenden, dass das schon längst kann.

Schau dir mal https://html-agility-pack.net/ an - versuch's damit aufzubauen - und wenn da was schief geht: Weiter fragen.

LG

PS: Dein hier gezeigter Teil vom HTML ist ungültig. HTML-Tags gibt's eigentlich nur folgendermaßen:
<td**>**MyText</td>
(Der fett markierte Teil fehlt bei dir, wenn das so ist - hilft dir vermutlich auch das AgilityPack nicht mehr...)

D
Demokrit Themenstarter:in
10 Beiträge seit 2018
vor 5 Jahren

Hey ich habe das auch schon mit dem Agility Pack versucht gestern damit habe ich das "spätere filtern" hinbekommen aber das einlesen hat immer noch nicht geklappt.

Das Agility pack habe ich benutzt um die ganzen Zeichen von HTML zu entfernen aber nach Stundenlangem ausprobieren habe ich gemerkt das ich die Zeichen brauche um zusätzlich zu Filtern.

Das einzige was fehlt ist nur die Zeilen einzulesen die zwischen <td und <\td> stehen.

D
Demokrit Themenstarter:in
10 Beiträge seit 2018
vor 5 Jahren

Post mal bitte ein Beispiel-HTML Markup.
Laut deiner Beschreibung ist das kein valides HTML.




html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>
          Tabelle Artikel</title>
  </head>
  <body>
    <table width="900" cellspacing="0" cellpadding="0">
      <tr>
        <td style="vertical-align:top;font-family:Arial;font-size:14pt;">
              Tabelle <strong>Artikel</strong><span style="font-size:10pt;padding-left:10"><a href="_Index.html">Tabellen-Übersicht</a></span></td>
      </tr>
      <tr>
        <td style="vertical-align:top;font-family:Arial;font-size:.8em;padding-bottom:5;padding-left:30;">&nbsp;</td>
      </tr>
      <tr>
        <td>
          <table border="0" cellpadding="1" cellspacing="0" style="border:1px solid darkgray;width:100%">
            <thead>
              <tr>
                <td style="font-family:Arial; font-size:.9em;font-weight:bold;">Name</td>
                <td style="font-family:Arial; font-size:.9em;font-weight:bold;">Label</td>
                <td style="font-family:Arial; font-size:.9em;font-weight:bold;">Typ</td>
                <td style="font-family:Arial; font-size:.9em;font-weight:bold;">MDT</td>
                <td style="font-family:Arial; font-size:.9em;font-weight:bold;">Format</td>
              </tr>
            </thead>
            <tbody>

Das ist ein Beispiel. In dem Fall sollte alles ignoriert werden was nicht zwischen <td und <\td> steht

2.079 Beiträge seit 2012
vor 5 Jahren

Also ich persönlich würde XPath verwenden.

Ich arbeite derzeit an einer Schnittstelle zu einem SAP-System, die über das iDOC-Format (XML) kommuniziert und hab dabei XPath lieben gelernt.
Und HTML im Grunde auch XML ist bzw. die selbe Syntax nutzt - why not?

Alles Nötige hat .NET schon an Bord:
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/linq/how-to-query-linq-to-xml-using-xpath

Die Syntax muss man sich zwar erst Mal aneignen, ich finde sie aber sehr eingängig und solche Test-Seiten helfen auch sehr:
https://www.freeformatter.com/xpath-tester.html

1.029 Beiträge seit 2010
vor 5 Jahren

@Palladin: XPath verwendet man ja auch beim HtmlAgilityPack - nur, dass hier teils schon automatische Fehlerkorrektur eingebaut ist soweit möglich.

@TE:
Ich weiß zwar nicht woran du gescheitert bist - aber ich behaupte es wäre mit dem AgilityPack einfacher. Dein HTML sieht valide aus - und mal als Beispielcode um die Texte der letzten TD-Tabelle anzuzeigen würde mal folgendermaßen vorgehen:


static void Main()
        {
            var path = @"C:\test.html";
		
            var doc = new HtmlDocument();
            doc.Load(path);

            var tdNodes = doc.DocumentNode.SelectNodes("/html[1]/body[1]/table[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[1]/td");
            var values = tdNodes.Select(node => node.InnerText);
            foreach(var value in values)
                Console.WriteLine(value);
            Console.ReadLine();
        }

LG

PS: Den XPath den ich dort verwendet habe gibt dir HtmlAgilityPack schon im Debugger beim Durchnavigieren.

PPS: Da ich davon ausgehe, dass du nicht an den Überschriften interessiert bist habe ich dein HTML-Beispiel für meinen Code so erweitert, dass eben noch die wirklich interessante Tabelle mit irgendwelche Werten drin steht.

D
Demokrit Themenstarter:in
10 Beiträge seit 2018
vor 5 Jahren

Ich glaub es funktioniert jetzt es werden zumindest die richtigen Sachen angezeigt das Problem ist jetzt das ich zum Splitten das "</td>" brauche und das deswegen nicht gespeichert wird. Ich hab gehört das ist ein bisschen komisch den Delimiter (So nennt man das glaub ich oder ?) zu behalten aber das sollte ich hinkriegen

T
64 Beiträge seit 2010
vor 5 Jahren

Ich würde es garnicht programmieren wollen...nimm PowerQuery von Microsoft.
Ist ein kostenloses ExcelPlugin das genau das kann.

Ab Excel 2016 ist es dabei und heißt Get and Transform.