Internetseiten korrekt auslesen

Kaiser206

Erfahrenes Mitglied
Hallo,
ich habe folgendes problem:
Ich lade eine webseite in eine Varianle(String Seite[100]). Dabei ist es für die weitere Programmierung wichtig, das jede ausgelesene Zeile korrekt eingeordnet wird:

Code:
Seite[1] = "<html>";
Seite[2] = "<head>";

Was auch gut bei meinen eigenen Webseiten funktioniert. Wenn ich jetzt aber fremde webseiten auslese, kommt folgendes Problem auf:
Meine Webseite sieht so aus:
Code:
<html>
  <head>
  </head>
  <body>
  </body>
</html>
Viele Webseiten sehen aber so aus(# steht für ein Zeichen das ich hier nicht reinposten kann):
Code:
<html>#  <head>#  </head>
  <body>
  </body>
</html>
Wenn sich eine seite downloade bekomme ich folgendes ergebnis:
Code:
Seite[0] = "<html># <head># </head>";
Seite[1] = "  <body>";
Seite[2] = "  </body>";
Seite[3] = "</html>";

Meine Frage ist jetzt also, wie ich das obere beispiel in folgendes umwandeln kann:
Code:
Seite[0] = "<html>";
Seite[1] = "  <head>";
Seite[2] = "  </head>";
Seite[3] = "  <body>";
Seite[4] = "  </body>";
Seite[5] = "</html>";

Das eigendliche Problem ist, das ich nicht weiß, wie ich eine Abfrage zu diesem Zeichen erstellen soll. Das Zeichen ist einfach nur ein Quadrat.
Danke im Vorraus!
 
Ich weiss nicht, was du mit dem ausgelesenen HTML vorhast, aber zeilenweises Verarbeiten anhand von Zeilenumbrüchen ist hier eigentlich nicht sehr sinnvoll. Es ist durchaus möglich (zugegeben nicht die Regel) die gesamte HTML-Seite innerhalb einer einzigen Zeile, d.h. ohne einen einzigen Zeilenumbruch, unterzubringen. Besser wäre es daher, die HTML-Daten zeichenweise zu verarbeiten und dabei auf die öffnenden und schließenden Klammern ( "<" und ">" ) zu schauen, um die einzelnen HTML-Tags zu separieren.
Die seltsamen Zeichen könnten möglicherweise Tabs sein.

Gruß
MCoder
 
Mir ist ja schon klar, das es für einen browser so sinnvoller währe, aber bei meinem Programm muss ich alles zeilenweise auslesen. Ich bin mir ziemlich sicher, das das seltsame zeichen ein /n ist. Ich müsste also eine Funktion schreiben, die den gesamten Text nach einem \n durchsucht und ihn an diesen Stellen teilt. Jetzt kommt aber dazu, dass manche Zeilen bereits getrennt sind. Ich müsste also Die getrennten Zeilen so übernehmen und manche weiter teilen(wo das \n zeichen auftaucht.). Zum schluss muss das rauskommen was ich oben beschrieben habe.

Ich versuch mal die Funktion selbst zu schreiben. Freue mich aber auch über mögliche Codeschnipsel!
 
...aber bei meinem Programm muss ich alles zeilenweise auslesen.
Den HTML-Quellcode zeilenweise strukturiert zu speichern ist ok, aber was ist bei dir eine Zeile? Ein kompletter HTML-Tag ? Oder beginnende und endende Tags sowie die dazwischen stehenden Daten in jeweils eine Zeile? Wie bereits gesagt, können Zeilenumbrüche bei HTML sehr willkürlich sein. Du musst also erst mal Kriterien (möglichst allgemein) für den Inhalt einer Zeile OHNE Berücksichtigung von Zeilenumbrüchen festlegen.

Ich bin mir ziemlich sicher, das das seltsame zeichen ein /n ist
Das dürfte dann ein UNIX-Zeilenumbruch sein (statt /r/n bei Windows/DOS).

Gruß
MCoder
 
Wie ich schon oben gezeigt habe, muss ich eine Webseite korrekt auslesen. Das heißt:
alle /r/n und /n ergeben eine neue Zeile. Ich müsste also eine Funktion schreiben, die einen String in einen Stringarray aufteilt. Dann muss jeder array nach einem /r/n oder /n enden.

Programm:
Code:
String Webseite = "<html>\n</html>\r\n</head>";
String[100] Ausgabe;
Ausgabe = Umwandeln(Webseite);

Ausgabe:
Code:
Ausgabe[0] = "<html>";
Ausgabe[1] = "</html>";
Ausgabe[2] = "</head>";



Wäre nett wenn jemand ein paar codeschnipsel postet!

PS: Mein Programm sollte eine Webseite einfach so anzeigen wie der Programmierer sie geschrieben hatt und die php zeilenumbrüche in die von Windows umwandeln. Wieso nicht anders? Weil es ja der sinn des Programms ist das es das so ausgibt.
 
Zuletzt bearbeitet:
Hallo,

das zu programmieren ist eigentlich kein großes Drama. Für die Stringliste habe ich einen vector verwendet, damit die ganze Angelegenheit dynamisch wird (man weiß ja vorher nicht, wieviel Zeilen denn da kommen).

Gruß
MCoder

C++:
// Benötigte Includes

#include <vector>
#include <math.h>

/////////////////////////////////////////////////////////////////

CString strWebseite = _T("<html>\n</html>\r\n</head>");

/////////////////////////////////////////////////////////////////
// Einlesen

std::vector<CString> stringList;
int nStartPos  = 0;
int nStringLen = strWebseite.GetLength();

while(1)
{
    int nLF = strWebseite.Find('\n', nStartPos);
    int nCR = strWebseite.Find('\r', nStartPos);
    int nPos;

    if( nLF == (-1) && nCR == (-1) )
    {
        break; // nix gefunden
    }

    if( abs(nCR - nLF) == 1 ) // Kombination aus \r und \n
    {
        nPos = max(nCR, nLF);
        stringList.push_back(strWebseite.Mid(nStartPos, nPos - nStartPos - 1));
        nStartPos = nPos + 1;
    }
    else // einzelnes \r oder \n
    {
        nPos = min(nLF, nCR);
        stringList.push_back(strWebseite.Mid(nStartPos, nPos - nStartPos));
        nStartPos = nPos + 1;
    }

    if( nStartPos >= nStringLen )
    {
        break; // String-Ende erreicht
    }
}

if( (nStartPos + 1) < nStringLen )
{
    // Letzte Zeile
    stringList.push_back(strWebseite.Mid(nStartPos, nStringLen - nStartPos));
}

/////////////////////////////////////////////////////////////////
// Ausgabe (zum Testen)

CString strResult = _T("");

for( int i = 0; i < stringList.size(); i++ )
{
    strResult += stringList[i] + _T("\r\n");
}

AfxMessageBox(strResult);
 
Zurück