Seite 1 von 2
C - Internetseite einlesen
Verfasst: Sa Jan 23, 2010 8:30 pm
von stampuhh
Hey,
ich habe mal wieder eine Frage. Und zwar bin ich auf der Suche nach der Möglichkeit mit C eine Seite von einer Internetseite einzulesen. Unter Linux verwende ich libxml2 dafür, was auch super klappt (sind XML-Dateien). Unter Windows7 funktioniert der XMLReaderForFile aber nicht (oder ich habe irgendwas falsch gemacht). Zumindest liefert er immer nur NULL zurück, also klappt da irgendetwas nicht so wie ich das gerne hätte.
Daher jetzt meine Frage: Gibt es so eine Art fopen für Internetseiten auf Windows? Oder muss ich da zu Sockets greifen? Das ist ja unter Windows auch nicht gerade "schön" zu handhaben.
gruß stampuhh
Re: C - Internetseite einlesen
Verfasst: Sa Jan 23, 2010 10:21 pm
von Xin
Mir ist derartiges nicht bekannt - ich habe das mal unter Linux mit Sockets gemacht. Unter Windows würde ich es vermutlich erstmal genauso machen.
Das Thema ist Windowsspezifisch, ich habe es daher verschoben.
Re: C - Internetseite einlesen
Verfasst: Sa Jan 23, 2010 10:37 pm
von stampuhh
Ok dann muss ich mich wieder mit Sockets beschäftigen
Da werde ich dann bestimmt hier auch noch mal was nachfragen, sei denn ich kriege diese libxml2 Geschichte da noch hin
gruß stampuhh
Re: C - Internetseite einlesen
Verfasst: Sa Jan 23, 2010 11:35 pm
von nufan
Was genau willst du? Den Quellcode der Seite oder die Seite einfach grafisch anzeigen? Qt (mit C++) bietet für beides Lösungen, wobei grafisches anzeigen um einiges leichter ist als den Quellcode anzuzeigen. Es gibt auch einige XML-Klassen, davon hab ich aber ehrlich gesagt keine Ahnung.
Hab schnell was gebastelt:
Quellcode auslesen:
main.cpp
Code: Alles auswählen
#include <QApplication>
#include <QTextEdit>
#include "PageReader.h"
int main (int argc, char *argv[])
{
QApplication app (argc, argv);
PageReader pr;
QTextEdit textedit;
QObject::connect (&pr, SIGNAL (ShowCode (QString)), &textedit, SLOT (setPlainText (QString)));
pr.manager -> get (QNetworkRequest (QUrl ("http://tutorial.proggen.org/doku.php")));
textedit.setWindowTitle ("Source viewer");
textedit.show ();
return app.exec ();
}
PageReader.h
(der Einfachheit halber mache ich den NetworkAccessManager public, was man aber natürlich nicht tun sollte)
Code: Alles auswählen
#ifndef PAGEREADER_H
#define PAGEREADER_H
#include <QHttp>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
class PageReader : public QHttp
{
Q_OBJECT
public:
PageReader ();
~PageReader ();
QNetworkAccessManager *manager;
private slots:
void WriteCode (QNetworkReply *);
signals:
void ShowCode (QString);
};
#endif // PAGEREADER_H
PageReader.cpp
Code: Alles auswählen
#include "PageReader.h"
PageReader::PageReader()
{
manager = new QNetworkAccessManager (this);
connect (manager, SIGNAL (finished (QNetworkReply *)), this, SLOT (WriteCode (QNetworkReply *)));
}
PageReader::~PageReader()
{
delete manager;
}
void PageReader::WriteCode (QNetworkReply *reply)
{
QByteArray data = reply -> readAll ();
emit ShowCode (QString (data));
}
Ergebnis:
http://img63.imageshack.us/i/codeviewer.png/
Webseite grafisch anzeigen:
main.cpp
Code: Alles auswählen
#include <QApplication>
#include <QWebView>
int main (int argc, char *argv[])
{
QApplication app (argc, argv);
QWebView wv;
wv.load (QUrl ("http://tutorial.proggen.org/doku.php"));
wv.show ();
return app.exec ();
}
Ergebnis:
http://img35.imageshack.us/i/webpageviewer.png/
Wenn dich das interessiert, kann ich dir den Code gerne genauer erklären, der soll nämlich eher als Demonstration dienen wie sowas in Qt aussehen würde. Wenn du noch immer Sockets willst, kannst du die von Qt übrigens auch nehmen ^^
PS: Nein ich bin kein Angestellter von Nokia, der hier dauernd Werbung für Qt macht

Re: C - Internetseite einlesen
Verfasst: So Jan 24, 2010 10:42 am
von stampuhh
Danke erst mal dafür!
Aber um etwas mit deinem Code anfangen zu können muss ich erst mal mit C++ weiter machen

Ich bin nämlich noch bei C und den Anfängen von C++ (cout/cin). Aber um deine Fragen zu beantworten:
Was genau willst du? Den Quellcode der Seite oder die Seite einfach grafisch anzeigen? Qt (mit C++) bietet für beides Lösungen, wobei grafisches anzeigen um einiges leichter ist als den Quellcode anzuzeigen. Es gibt auch einige XML-Klassen, davon hab ich aber ehrlich gesagt keine Ahnung.
Ich will weder den Code noch die Seite grafisch anzeigen lassen, da ich ja immer noch auf der Konsole arbeite

Es geht mir darum Seiten, genauer gesagt wirklich XML-Dateien, einzulesen und zu verarbeiten, bzw eigentlich will ich nur einen einzigen Wert auslesen. Das ganze habe ich unter Linux schon mit libxml2 geschafft. Eigentlich gibt es das ganze auch für Windows nur es läuft bei mir nicht. Daher wollte ich nach einer Alternative suchen. Aber die libxml2 ist ja auch nicht gerade "wenig" und da kann ich auch noch etwas rum probieren. Mein Problem ist eigentlich nur diese Zeile
Code: Alles auswählen
url="http://www.dieseite.de/abfrage.aspx?name=Horst";
xmlTextReaderPtr reader;
reader = xmlReaderForFile(urlname, NULL, 0);
if(reader != NULL) //usw. Hier geht es nie rein, da der reader unter Windows == NULL ist
Aber ich glaube auf den Qt-Code komme ich zurück, da ich das auf jeden Fall auch noch grafisch umsetzen wollte. Ist als Übung auf jeden Fall sehr gut für mich. Aber bis dahin ist es glaube ich noch ein steiniger Weg
Und dein Messanger gefällt mir grafisch auch ganz gut, daher kann ich die Werbung für QT auch verstehen
gruß stampuhh
Re: C - Internetseite einlesen
Verfasst: So Jan 24, 2010 12:11 pm
von nufan
stampuhh hat geschrieben:Ich bin nämlich noch bei C und den Anfängen von C++ (cout/cin). Aber um deine Fragen zu beantworten:
Was genau willst du? Den Quellcode der Seite oder die Seite einfach grafisch anzeigen? Qt (mit C++) bietet für beides Lösungen, wobei grafisches anzeigen um einiges leichter ist als den Quellcode anzuzeigen. Es gibt auch einige XML-Klassen, davon hab ich aber ehrlich gesagt keine Ahnung.
Ich will weder den Code noch die Seite grafisch anzeigen lassen, da ich ja immer noch auf der Konsole arbeite

Es geht mir darum Seiten, genauer gesagt wirklich XML-Dateien, einzulesen und zu verarbeiten, bzw eigentlich will ich nur einen einzigen Wert auslesen.
Wie gesagt hat Qt auch ein paar XML-Klassen. Du kannst ja mal durch die Doku browsen und gucken ob da was für dich dabei ist. Von XML hast du nämlich bestimmt mehr Ahnung als ich ^^
http://doc.trolltech.com/4.5/xml-tools.html
stampuhh hat geschrieben:Mein Problem ist eigentlich nur diese Zeile
Code: Alles auswählen
url="http://www.dieseite.de/abfrage.aspx?name=Horst";
xmlTextReaderPtr reader;
reader = xmlReaderForFile(urlname, NULL, 0);
if(reader != NULL) //usw. Hier geht es nie rein, da der reader unter Windows == NULL ist
Schon versucht im else eine Fehlermeldung auszugeben? Vielleicht hat libxml eine eigene Funktion dafür, ansonsten die Standardfunktion:
Re: C - Internetseite einlesen
Verfasst: So Jan 24, 2010 12:27 pm
von stampuhh
Danke für den Tipp. Hab ich jetzt mal ausprobiert und da bekomme ich die Meldung "No such file or directory".
Wie gesagt hat Qt auch ein paar XML-Klassen. Du kannst ja mal durch die Doku browsen und gucken ob da was für dich dabei ist. Von XML hast du nämlich bestimmt mehr Ahnung als ich ^^
http://doc.trolltech.com/4.5/xml-tools.html
Sobald ich soweit bin schaue ich mir das ganze mal an, ich brauche ja sicherlich C++ um die Sachen zum laufen zu bekommen oder?
Ich habe vorhin dann mal versucht per URLDownloadToFile einfach die XML Datei herunterzuladen, aber dafür brauche ich auch wieder das Windows SDK und das ist mir zu groß gerade. Habe nur 80kb/s down übers Wochenende.
Jetzt werde ich das wohl erst mal per Libcurl machen, Datei herunterladen speichern und dann verarbeiten

Muss nur noch schauen ob ich das in den Speicher lade und dann verarbeite oder als Datei speichere und dann mit libxml wieder einlese und verarbeite^^
Da hab ich auch gerade mal eine andere Frage: Muss ich Bibliotheken alle in mein system32-Verzeichnis packen damit ich die Programme ausführen kann oder gibt es eine Möglichkeit das Ganze irgendwie einzubinden so dass ich die Sachen aus ausführen könnte ohne die dlls auf dem PC zu haben?
Gibt es dazu übrigens eine Seite im Tutorial?
gruß stampuhh
Re: C - Internetseite einlesen
Verfasst: So Jan 24, 2010 12:33 pm
von nufan
stampuhh hat geschrieben:Danke für den Tipp. Hab ich jetzt mal ausprobiert und da bekomme ich die Meldung "No such file or directory".
Wie lautet denn der genaue Pfad zu der Seite?
stampuhh hat geschrieben:Sobald ich soweit bin schaue ich mir das ganze mal an, ich brauche ja sicherlich C++ um die Sachen zum laufen zu bekommen oder?
Ja.
stampuhh hat geschrieben:Da hab ich auch gerade mal eine andere Frage: Muss ich Bibliotheken alle in mein system32-Verzeichnis packen damit ich die Programme ausführen kann oder gibt es eine Möglichkeit das Ganze irgendwie einzubinden so dass ich die Sachen aus ausführen könnte ohne die dlls auf dem PC zu haben?
Der Benutzer muss entweder die dlls im system32-Verzeichnis oder im Verzeichnis der Anwendung haben. Weiters kannst du die Bibliotheken statisch in deine Anwendung linken. Wie das geht und ob das die Bibliothek lizenztechnisch erlaubt musst du selbst rausfinden.
Re: C - Internetseite einlesen
Verfasst: So Jan 24, 2010 12:41 pm
von stampuhh
Der Pfad lautet "
http://www.agecommunity.com/query/query ... st&md=user" als Beispiel.
Das sind Userstatistiken, falls du dich fragst was das ist. Ich bastle mir gerade ein Programm zusammen womit ich sehen kann ob Personen online sind oder nicht. Unter Linux funktioniert das wie gesagt ja auch brav...
Der Benutzer muss entweder die dlls im system32-Verzeichnis oder im Verzeichnis der Anwendung haben. Weiters kannst du die Bibliotheken statisch in deine Anwendung linken. Wie das geht und ob das die Bibliothek lizenztechnisch erlaubt musst du selbst rausfinden.
Das sollte ich mir in der Tat mal irgendwo durchlesen. Solange das ganze nur für mich ist, ist das aber ja kein Problem. Ansonsten kann man ja einen Installer anbieten, der die Bibliotheken mitverteilt schätze ich mal.
gruß stampuhh
Re: C - Internetseite einlesen
Verfasst: Fr Apr 23, 2010 9:00 am
von danibert
@ nufan
...wie kann ich die Ausgabe der Webseite in eine Variable legen, um sie z.B. später in einem Label anzuzeigen? (Anstelle des textedit-Fensters)
Ich habe mit Deinem Beispiel experimentiert, bekomme das mit der Variable aber nicht zum Laufen.