如何将所有p / div标签写入txt文件

时间:2013-07-13 17:59:44

标签: c++ qt

我需要编写Qt / C ++代码来提取所有p标签,将每个p标签写入.txt文件,例如,如果我有以下HTML页面:

        <!DOCTYPE html>
        <html>
         <body>

         <h1>My First Heading</h1>

         <p>My first paragraph.</p>
         <p>My second paragraph.</p>

         </body>
          </html>

我需要代码来创建2 .txt文件,第一个文件将包含我的第一段。第二段将包括我的第二段。

我的问题如何解析html并获得标签之间的txt,这里是我的代码

         int main(int argc, char *argv[])
           {
            QApplication a(argc, argv);

              QWebPage page;
              QWebFrame * frame =page.mainFrame();
               QUrl fileUrl ("https://en.wikipedia.org/wiki/Bank");
                frame->setUrl(fileUrl);
                QWebElement document = frame->documentElement();
            QWebElementCollection collection = document.findAll("p");

             foreach (QWebElement paraElement, collection) {

              }



                  MainWindow w;
                 w.show();

             return a.exec();
           }

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

这是非常天真地执行你的要求。

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <string>
#include <stack>
#include <queue>
#include <fstream>
#define BUFFER_SIZE 256 
//assuming flush means just printing 
//the <p> tags on the console.
void flushqueue(queue<string>& qtags){
  while(!qtags.empty()){

    cout <<std::endl << qtags.front() <<std::endl;
    qtags.pop();
  }
}
#define STAGSIZE 3
#define ETAGSIZE 4
const char *stag = "<p>";
const char *etag = "</p>";

void process(const string& instr,vector< pair<size_t,size_t> >& vectags){
    size_t  index = 0;
    pair<size_t,size_t>res(-1,-1);
    while(index !=string::npos  && index < instr.length()){
      res.first = -1;
      res.second = -1;
      index = instr.find(stag,index);
      if(index != string::npos){
    index+=STAGSIZE;
    res.first = index;
      }
      index = instr.find(etag,index);
      if(index != string::npos){
    res.second = index-1;
    index +=ETAGSIZE;
      }
      if(res.first !=-1 || res.second != -1)
    vectags.push_back(res);
    }
  }

int readptags(const char* filename){
  std::ifstream ifs (filename);
  queue<string>qbuffer;
  vector<pair<size_t,size_t> >vtags;
  string stag;
  while(ifs.good()){
    string temp;
    getline(ifs,temp);
    vtags.clear();
    process(temp,vtags);
    for(int i=0;i<vtags.size();i++){
      pair<size_t,size_t>res = vtags[i];
      if(res.first!=-1 && res.second !=-1){
    //a full string
    qbuffer.push(string(temp.begin()+res.first,temp.begin()+res.second+1));
      }else if(res.first==-1 && res.second !=-1){
    stag+=string(temp.begin(),temp.begin()+res.second+1) ;
    qbuffer.push(stag);
    stag.clear();
      }else if(res.first!=-1 && res.second ==-1){
    stag += string(temp.begin()+res.first,temp.end());
      }else{
    continue;
      }
    }
    if(qbuffer.size()>=BUFFER_SIZE)
      flushqueue(qbuffer);
  }
  flushqueue(qbuffer);
}
  int main(){
    //readptags("prac.html");
  }