2014-02-22 126 views
3

我正在尝试使用Poco从reddit的首页获取新闻。我正在看这个pdf(http://pocoproject.org/slides/200-Network.pdf)作为答案,但在这一点上我有点头痛,我不知道如何实现我的目标。正如我所说的,我只是想从www.reddit.com上获取新闻报道(特别是文章标题)。如何使用C++从网页获取文本?

我到目前为止的代码reddit的的头版和cout它的屏幕抓取全部下HTML:

#include <iostream>   
#include "Poco/Net/SocketAddress.h" 
#include "Poco/Net/StreamSocket.h" 
#include "Poco/Net/SocketStream.h" 
#include "Poco/StreamCopier.h" 

using namespace std; 
using namespace Poco::Net; 
using namespace Poco; 

int main(int argc, char *argv[]) 
{ 
    SocketAddress sa("www.reddit.com", 80); 
    StreamSocket socket(sa); 
    SocketStream str(socket); 
    str << "GET/HTTP/1.1\r\n" 
    "Host: www.reddit.com\r\n" 
    "\r\n"; 
    str.flush(); 

    StreamCopier::copyStream(str, cout); 

    system("PAUSE"); 
} 

综观上述PDF,它看起来像我的答案可能是在那里某处,但我仍然在学习计算机网络和互联网协议,所以大部分都在我的头上。

主要问题:有人可以帮助我弄清楚如何得到www.reddit.com文章标题为一个字符串或字符串数​​组?

+0

OK,读/获取HTML内容的一两件事,解析它是更困难: 例如使用Qt框架,以获取新闻标题。 POCO提供了一个HTML文件模型AFAIR,我只是害怕它是图书馆的商业部分之一:(... –

+0

你可以使用别的东西,然后波科呢? – ibizaman

+0

我认为这将取决于你需要什么。为什么你不使用一些基本的字符串解析?字符串' Svend

回答

1

为什么不抓住http://www.reddit.com/.rss,这比html简单得多?

class Foo : public QObject { Q_OBJECT 
public: 
    Foo(); 
private slots: 
    void got_it(QNetworkReply* reply); 
private: 
    QNetworkAccessManager* news_grabber; 
}; 

Foo::Foo() { 
    news_grabber = new QNetworkAccessManager(this); 
    QObject::connect(news_grabber, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(got_it(QNetworkReply*))); 
    news_grabber->get(QNetworkRequest(QUrl("http://www.reddit.com/.rss"))); 
} 

void Foo::got_it(QNetworkReply* reply) { 
    QDomDocument document; 
    std::vector<QString> items_storage; 
    document.setContent(static_cast<QIODevice*>(reply)); 
    QDomNodeList items = document.elementsByTagName("item"); 
    for (int i = 0; i < items.length(); i++) 
     items_storage.push_back(items.at(i).firstChildElement("title").text()); 
    }