13

我正在尝试以字符串形式获取网页数据,而我无法解析它。我没有在 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);

任何结果 =(.

4

3 回答 3

26

你看过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。一个简单的方法是调用readAll来获取QByteArray。您可以从该 QByteArray 构造一个QString并使用它做任何您想做的事情。

于 2009-06-27T16:27:48.103 回答
2

Paul Dixon 的回答可能是最好的方法,但 Jesse 的回答确实触及了一些值得一提的东西。

cURL——或者更准确地说是 libcURL 是一个非常强大的库。无需执行 shell 脚本和解析输出,libCURL 可用 C、C++ 和更多的语言,而不是你可以摇动 URL。如果您正在执行一些 qt 不支持的奇怪操作(例如 http POST over ssl?),它可能会很有用。

于 2009-06-28T07:18:30.483 回答
1

您是否研究过 lynx、curl 或 wget?过去,我需要从网站获取和解析信息,无数据库访问,如果您尝试获取动态格式化的数据,我相信这将是最快的方法。我不是 C 人,但我认为有一种方法可以运行 shell 脚本并获取数据,或者至少让脚本运行并在写入文件后从文件中获取输出。在最坏的情况下,您可以运行一个 cron 并使用 C 检查写入文件末尾的“已完成”行,但我怀疑这是否必要。我想这取决于您需要它来做什么,但是如果您只想要页面的输出 html,那么像 wget 这样通过管道传输到 awk 或 grep 的东东可以创造奇迹。

于 2009-06-27T16:55:39.083 回答