2009-06-27 16 views
11

? Estoy tratando de obtener datos de la página web en cadena que lo pude analizar. No encontré ningún método en qwebview, qurl y otro. ¿Usted me podría ayudar? Linux, C++, Qt.¿Cómo puedo obtener el contenido de la página web

EDIT:

Gracias por la ayuda. El código funciona, pero algunas páginas después de la descarga tienen un juego de caracteres roto. Probé algo como esto para repararlo:

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); 

Todos los resultados = (

Respuesta

26

¿Has mirado en QNetworkAccessManager He aquí una muestra de uso ilustrando áspero y listo:.?

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! 

} 

En su en su controlador para la señal finished se le pasará un objeto QNetworkReply, que puede leer la respuesta de hereda de QIODevice. Una manera simple de hacerlo es solo ca ll readAll para obtener un QByteArray. Puede construir un QString desde ese QByteArray y hacer lo que quiera con él.

+0

Gracias por responder. Pero recibí un error: Objeto :: conectar: ​​No hay tal ranura MainWindow :: replyFinished (QNetworkReply *) – Ockonal

+0

necesita agregar una ranura a la clase de recepción con la firma void replyFinished (QNetworkReply *) –

+0

Lo siento, lo entendí. Pero no sé cómo leer datos todavía. Ayúdame, por favor :) – Ockonal

1

¿Has mirado en lynx, curl o wget? En el pasado, tuve que tomar y analizar información de un sitio web, acceso sans db, y si está tratando de obtener datos formateados dinámicamente, creo que esta sería la forma más rápida. No soy un chico C, pero supongo que hay una forma de ejecutar scripts de shell y tomar los datos, o al menos ejecutar el script y obtener el resultado de un archivo después de escribirlo. En el peor de los casos, podría ejecutar un cron y buscar una línea "finalizada" al final del archivo escrito con C, pero dudo que sea necesario. Supongo que depende de lo que necesites, pero si solo quieres la salida html de una página, algo tan al este como un wget canalizado a awk o grep puede hacer maravillas.

2

La respuesta de Paul Dixon es probablemente la mejor, pero la respuesta de Jesse toca algo que vale la pena mencionar.

cURL - o más precisamente libcURL es una biblioteca maravillosamente poderosa. No es necesario ejecutar scripts de shell y analizar el resultado, libCURL está disponible en C, C++ y en más idiomas de los que puede agitar una URL. Puede ser útil si está realizando alguna operación extraña (como http POST sobre ssl?) Que qt no admite.

+0

¿Alguien puede confirmar que Qt no puede manejar POST a través de SSL? – Andrioid

+1

@Andrioid Qt maneja POST a través de SSL sin problemas. –

+0

Creo que C-o-r-E significa que qt no lo hace por usted, solo tendrá que usar qt como una herramienta para hacerlo no como una solución. –

Cuestiones relacionadas