myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Wie kann ich eine HTML-Datei lesen, filtern und bestimmte Teile in eine Excel Tabelle schreiben?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Demokrit
myCSharp.de-Mitglied

Dabei seit: 20.11.2018
Beiträge: 10


Demokrit ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
    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.
14.03.2019 10:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MorphieX MorphieX ist männlich
myCSharp.de-Mitglied

Dabei seit: 06.02.2012
Beiträge: 183
Entwicklungsumgebung: VS 2015 Community
Herkunft: Rahden


MorphieX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Post mal bitte ein Beispiel-HTML Markup.
Laut deiner Beschreibung ist das kein valides HTML.
14.03.2019 10:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 944
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...)
14.03.2019 10:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Demokrit
myCSharp.de-Mitglied

Dabei seit: 20.11.2018
Beiträge: 10

Themenstarter Thema begonnen von Demokrit

Demokrit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
14.03.2019 10:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Demokrit
myCSharp.de-Mitglied

Dabei seit: 20.11.2018
Beiträge: 10

Themenstarter Thema begonnen von Demokrit

Demokrit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

XML-Code:
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
14.03.2019 10:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.170
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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/...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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am 14.03.2019 10:56.

14.03.2019 10:49 Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 944
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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:

C#-Code:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Taipi88 am 14.03.2019 11:09.

14.03.2019 11:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Demokrit
myCSharp.de-Mitglied

Dabei seit: 20.11.2018
Beiträge: 10

Themenstarter Thema begonnen von Demokrit

Demokrit ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Demokrit am 14.03.2019 11:18.

14.03.2019 11:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
toxic
myCSharp.de-Mitglied

Dabei seit: 21.04.2010
Beiträge: 61
Entwicklungsumgebung: VS2012
Herkunft: Franken ;-)


toxic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
14.03.2019 14:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.07.2019 20:16