我怎样才能获得网页内容

时间:2009-06-27 16:10:08

标签: c++ qt webpage

我正在尝试获取字符串中的网页数据,而不是我可以解析它。我没有在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);

任何结果=(。

3 个答案:

答案 0 :(得分:25)

你看过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!

}

finished信号的处理程序中,您将传递一个QNetworkReply对象,您可以从QIODevice继承该对象。一个简单的方法是调用readAll来获取QByteArray。你可以从QByteArray构造一个QString并做任何你想做的事情。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你有没有看过ly ,,卷曲或wget? 在过去,我需要从网站获取和解析信息,没有数据库访问权限,如果您尝试获取动态格式化数据,我相信这将是最快捷的方式。我不是C人,但我认为有一种方法可以运行shell脚本并获取数据,或者至少让脚本运行并在写入文件后从文件中获取输出。在最糟糕的情况下,你可以运行一个cron并用C来检查写入文件末尾的“完成”行,但我怀疑这是必要的。我想这取决于你需要它的内容,但是如果你只想要一个页面的输出html,那么东西就像用wt管道输入awk或grep一样可以创造奇迹。

相关问题