Как я могу получить содержимое веб-страницы

StackOverflow https://stackoverflow.com/questions/1053099

  •  20-08-2019
  •  | 
  •  

Вопрос

я пытаюсь получить данные веб-страницы в виде строки, которую я мог бы разобрать.Я не нашел никаких методов в qwebview, qurl и других.Не могли бы вы мне помочь?Linux, C ++, Qt.

Редактировать:

Спасибо за помощь.Код работает, но на некоторых страницах после загрузки нарушена кодировка.Я попробовал что-то вроде этого, чтобы починить его:

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

Любые результаты =(.

Это было полезно?

Решение

Вы смотрели на Помощью QNetworkAccessManager?Вот примерный и готовый пример, иллюстрирующий использование:

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!

}

В вашем в вашем обработчике для ЗАКОНЧЕННЫЕ сигнал, по которому вам будет передан QNetworkReply объект, из которого вы можете прочитать ответ, поскольку он наследуется от QIODevice ( Кодовое устройство).Простой способ сделать это - просто вызвать Читать все чтобы получить QByteArray QByteArray.Вы можете сконструировать QString ( строка q ) из этого QByteArray и делайте с ним все, что хотите.

Другие советы

Ответ Пола Диксона, вероятно, является лучшим подходом, но ответ Джесси действительно затрагивает кое-что, о чем стоит упомянуть.

cURL - или, точнее, libcURL - это удивительно мощная библиотека.Нет необходимости выполнять сценарии оболочки и анализировать выходные данные, libCURL доступен на C, C ++ и большем количестве языков, чем вы можете указать по URL.Это может быть полезно, если вы выполняете какую-то странную операцию (например, http POST через ssl?), которую qt не поддерживает.

Вы заглядывали в lynx, curl или wget?В прошлом мне нужно было получать и анализировать информацию с веб-сайта без доступа к базе данных, и если вы пытаетесь получить динамически отформатированные данные, я считаю, что это был бы самый быстрый способ.Я не специалист по C, но я предполагаю, что есть способ запускать сценарии оболочки и извлекать данные или, по крайней мере, запускать скрипт и извлекать выходные данные из файла после записи в него.В худшем случае вы могли бы запустить cron и проверить наличие "готовой" строки в конце записанного файла с помощью C, но я сомневаюсь, что это будет необходимо.Я полагаю, это зависит от того, для чего вам это нужно, но если вам просто нужен выходной html страницы, что-то вроде wget, переданного по каналу в awk или grep, может творить чудеса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top