2009-06-27 34 views
11

próbuję uzyskać dane strony internetowej w ciągu, że niż mógłbym parsować. Nie znalazłem żadnych metod w qwebview, qurl i innym. Czy mógłbyś mi pomóc? Linux, C++, Qt.Jak mogę uzyskać zawartość strony internetowej

EDIT:

Dzięki za pomoc. Kod działa, ale niektóre strony po pobraniu mają zepsuty zestaw znaków. Próbowałem coś takiego, żeby go naprawić:

QNetworkRequest *request = new QNetworkRequest(QUrl("http://ru.wiktionary.org/wiki/bovo")); 

request->setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); " 
         "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1"); 
request->setRawHeader("Accept-Charset", "win1251,utf-8;q=0.7,*;q=0.7"); 
request->setRawHeader("charset", "utf-8"); 
request->setRawHeader("Connection", "keep-alive"); 

manager->get(*request); 

żadnych wyników = (

Odpowiedz

26

Czy spojrzał na QNetworkAccessManager Oto szorstki i gotowe próbki ilustrujący użycie:.?

class MyClass : public QObject 
{ 
Q_OBJECT 

public: 
    MyClass(); 
    void fetch(); 

public slots: 
    void replyFinished(QNetworkReply*); 

private: 
    QNetworkAccessManager* m_manager; 
}; 


MyClass::MyClass() 
{ 
    m_manager = new QNetworkAccessManager(this); 

    connect(m_manager, SIGNAL(finished(QNetworkReply*)), 
     this, SLOT(replyFinished(QNetworkReply*))); 

} 

void MyClass::fetch() 
{ 
    m_manager->get(QNetworkRequest(QUrl("http://stackoverflow.com"))); 
} 

void MyClass::replyFinished(QNetworkReply* pReply) 
{ 

    QByteArray data=pReply->readAll(); 
    QString str(data); 

    //process str any way you like! 

} 

w twojej w twoim handlerze dla sygnału finished zostanie ci przekazany obiekt QNetworkReply, z którego możesz odczytać odpowiedź z dziedziczenia z QIODevice. Prostym sposobem na zrobienie tego jest po prostu ca ll readAll, aby uzyskać QByteArray. Możesz skonstruować obiekt QString z tego QByteArray i zrobić, co chcesz z nim zrobić.

+0

Dzięki za odpowiedź. Ale mam błąd: Obiekt :: connect: Brak takiego slotu MainWindow :: replyFinished (QNetworkReply *) – Ockonal

+0

musisz dodać slot do klasy odbierającej z odpowiedzią void replyFinished (QNetworkReply *) –

+0

Przepraszam, zrozumiałem. Ale nie wiem jeszcze, jak odczytać dane. Pomóżcie mi, proszę :) – Ockonal

1

Czy zajrzałeś do rysia, kędzioru lub wget? W przeszłości musiałem pobierać i parsować informacje ze strony internetowej, nie mam dostępu do db, i jeśli próbujesz uzyskać dynamicznie sformatowane dane, uważam, że byłby to najszybszy sposób. Nie jestem typem C, ale zakładam, że istnieje sposób uruchamiania skryptów powłoki i pobierania danych, lub przynajmniej uruchomienia skryptu i pobrania danych z pliku po zapisaniu do niego. W najgorszym przypadku można uruchomić crona i sprawdzić "zakończoną" linię na końcu zapisanego pliku przy pomocy C, ale wątpię, czy będzie to konieczne. Przypuszczam, że zależy to od tego, czego potrzebujesz, ale jeśli chcesz po prostu wydrukować html strony, coś tak wschodniego, jak wget do awk lub grep może zdziałać cuda.

2

Odpowiedź Paula Dixona jest prawdopodobnie najlepszym podejściem, ale odpowiedź Jessego dotyka czegoś, o czym warto wspomnieć.

cURL - a dokładniej libcURL to cudownie potężna biblioteka. Nie ma potrzeby wykonywania skryptów powłoki i przetwarzania wynikowego, biblioteka libCURL jest dostępna w językach C, C++ i innych, niż można w niej podać. Może to być przydatne, jeśli robisz jakieś dziwne operacje (jak http POST przez ssl?), Które qt nie obsługuje.

+0

Czy ktoś może potwierdzić, że Qt nie może obsłużyć POST przez SSL? – Andrioid

+1

@Andrioid Qt obsługuje POST przez SSL bez problemów. –

+0

Myślę, że C-o-r-E oznaczało, że qt nie robi tego za ciebie, po prostu musisz użyć qt jako narzędzia, aby zrobić to nie jako rozwiązanie? –

Powiązane problemy