2009-05-07 17 views

risposta

34
  • libcurl per scaricare il file html
  • libtidy per convertire in XML valido
  • libxml per analizzare/scorrere l'xml
+1

il tuo secondo link dovrebbe probabilmente andare a http://tidy.sourceforge.net/? –

+0

+1 Esattamente quello che stavo cercando, ho usato curl molto dal cli ma non ho mai pensato di usarlo come libreria :) – rflood89

1
// download winhttpclient.h 
// -------------------------------- 
#include <winhttp\WinHttpClient.h> 
using namespace std; 
typedef unsigned char byte; 
#define foreach   BOOST_FOREACH 
#define reverse_foreach BOOST_REVERSE_FOREACH 

bool substrexvealue(const std::wstring& html,const std::string& tg1,const std::string& tg2,std::string& value, long& next) { 
    long p1,p2; 
    std::wstring wtmp; 
    std::wstring wtg1(tg1.begin(),tg1.end()); 
    std::wstring wtg2(tg2.begin(),tg2.end()); 

    p1=html.find(wtg1,next); 
    if(p1!=std::wstring::npos) { 
     p2=html.find(wtg2,next); 
     if(p2!=std::wstring::npos) { 
      p1+=wtg1.size(); 
      wtmp=html.substr(p1,p2-p1-1); 
      value=std::string(wtmp.begin(),wtmp.end()); 
      boost::trim(value); 
      next=p1+1; 
     } 
    } 
    return p1!=std::wstring::npos; 
} 
bool extractvalue(const std::wstring& html,const std::string& tag,std::string& value, long& next) { 
    long p1,p2,p3; 
    std::wstring wtmp; 
    std::wstring wtag(tag.begin(),tag.end()); 

    p1=html.find(wtag,next); 
    if(p1!=std::wstring::npos) { 
     p2=html.find(L">",p1+wtag.size()-1); 
     p3=html.find(L"<",p2+1); 
     wtmp=html.substr(p2+1,p3-p2-1); 
     value=std::string(wtmp.begin(),wtmp.end()); 
     boost::trim(value); 
     next=p1+1; 
    } 
    return p1!=std::wstring::npos; 
} 
bool GetHTML(const std::string& url,std::wstring& header,std::wstring& hmtl) { 
    std::wstring wurl = std::wstring(url.begin(),url.end()); 
    bool ret=false; 
    try { 
     WinHttpClient client(wurl.c_str()); 
     std::string url_protocol=url.substr(0,5); 
     std::transform(url_protocol.begin(), url_protocol.end(), url_protocol.begin(), (int (*)(int))std::toupper); 
     if(url_protocol=="HTTPS") client.SetRequireValidSslCertificates(false); 
     client.SetUserAgent(L"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
     if(client.SendHttpRequest()) { 
      header = client.GetResponseHeader(); 
      hmtl = client.GetResponseContent(); 
      ret=true; 
     } 
    }catch(...) { 
     header=L"Error"; 
     hmtl=L""; 
    } 
    return ret; 
} 
int main() { 
    std::string url = "http://www.google.fr"; 
    std::wstring header,html; 
    GetHTML(url,header,html)); 
} 
+5

codice senza spiegazione è una cattiva idea, puoi spiegare questo? –

2

consiglio QT5. 6.2, questa potente libreria fuori er noi

  1. alto livello, intuitivo, asincrono API di rete come QNetworkAccessManager, QNetworkReply, QNetworkProxy ecc
  2. potente classe regex come QRegularExpression
  3. motore Web decente come QtWebEngine
  4. robusta, gui maturo come QWidgets
  5. La maggior parte delle Qt5 api sono ben progettate, il segnale e lo slot rendono la scrittura di codici asincroni molto più semplici
  6. Supporto unicode grande
  7. Libreria di file system ricca di funzioni. Sia creare, eliminare, rinominare o trovare il percorso standard per salvare i file è un pezzo di torta in QT5
  8. API asincrona di QNetworkAccessManager rendere più facile per deporre le uova molti richiesta di download in una sola volta
  9. piattaforme desktop principali Croce, Windows, Mac OS e Linux , scrivi una volta compilato ovunque, solo una base di codice.
  10. facile da implementare su Windows e Mac (linux? Forse linuxdeployqt noi può risparmiare tonnellate di guai)
  11. Facile da installare su Windows, Mac e Linux
  12. E così via

ho già scritto un App per raschietto di immagini Qt5, questa app può raschiare quasi tutte le immagini cercate da Google, Bing e Yahoo.

Per ulteriori informazioni a riguardo, visitare my github project. Ho scritto una panoramica di alto livello su come raschiare i dati di Qt5 su i miei blog (è troppo lungo per postare allo stack overflow).

+0

Perché raccomandi la versione 5.6.2 e non l'ultima (attualmente è 5.9.0)? –

+0

@PiotrDobrogost Il motivo principale è che non so quanto sia stabile Qt5.9.0, un'altra ragione è il supporto per Qt5.6.2 windows xp – StereoMatching