C - Internetseite einlesen

Windowsspezifische Probleme, WinAPI, conio.h
Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

C - Internetseite einlesen

Beitrag von stampuhh » Sa Jan 23, 2010 8:30 pm

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
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C - Internetseite einlesen

Beitrag von Xin » Sa Jan 23, 2010 10:21 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - Internetseite einlesen

Beitrag von stampuhh » Sa Jan 23, 2010 10:37 pm

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

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C - Internetseite einlesen

Beitrag von nufan » Sa Jan 23, 2010 11:35 pm

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

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - Internetseite einlesen

Beitrag von stampuhh » So Jan 24, 2010 10:42 am

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 :roll:
Und dein Messanger gefällt mir grafisch auch ganz gut, daher kann ich die Werbung für QT auch verstehen :D

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C - Internetseite einlesen

Beitrag von nufan » So Jan 24, 2010 12:11 pm

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:

Code: Alles auswählen

printf ("Error: %s\n", strerror (errno));

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - Internetseite einlesen

Beitrag von stampuhh » So Jan 24, 2010 12:27 pm

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? :roll:

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C - Internetseite einlesen

Beitrag von nufan » So Jan 24, 2010 12:33 pm

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.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - Internetseite einlesen

Beitrag von stampuhh » So Jan 24, 2010 12:41 pm

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
NachDenkSeiten.de

danibert
Beiträge: 5
Registriert: Fr Apr 23, 2010 8:51 am

Re: C - Internetseite einlesen

Beitrag von danibert » Fr Apr 23, 2010 9:00 am

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

Antworten