【问题标题】:How can i get content of web-page如何获取网页内容
【发布时间】:2010-11-06 09:20: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);

任何结果 =(.

【问题讨论】:

    标签: c++ qt webpage


    【解决方案1】:

    你看过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 并使用它做任何您想做的事情。

    【讨论】:

    • 感谢您的回答。但我得到一个错误: Object::connect: No such slot MainWindow::replyFinished(QNetworkReply*)
    • 你需要给接收类添加一个slot,签名为void replyFinished(QNetworkReply*)
    • 对不起,我明白了。但我还不知道如何读取数据。请帮帮我:)
    • 在 QNetworkReply 参数上的 replyFinished 槽调用 readAll() 中,你会得到一个 QByteArray。
    • 我试试这个:manager->get(QNetworkRequest(QUrl("http:/stackoverflow.com")))->readAll().constData();它总是返回空字符串。为什么?
    【解决方案2】:

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

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

    【讨论】:

    • 谁能确认Qt不能通过SSL处理POST?
    • @Andrioid Qt 通过 SSL 处理 POST 没有问题。
    • 我认为 C-o-r-E 的意思是 qt 不适合你,你只需要使用 qt 作为工具而不是作为解决方案吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2016-12-07
      • 2011-06-24
      • 2011-07-15
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2013-07-28
      • 2013-05-01
      相关资源
      最近更新 更多