2009-05-07 13 views

Respuesta

34
  • libcurl para descargar el archivo html
  • libtidy para convertir a XML válido
  • libxml para analizar/navegar por el xml
+1

su segundo enlace probablemente debería ir a http://tidy.sourceforge.net/? –

+0

+1 Exactamente lo que estaba buscando, he usado curl mucho de la cli pero nunca pensé en usarlo como una biblioteca :) – 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

código sin explicación es una mala idea, ¿puedes explicarlo? –

2

recomiendo QT5. 6.2, esta poderosa biblioteca de er nos

  1. alto nivel, intuitiva, API de red asíncrona como QNetworkAccessManager, QNetworkReply, QNetworkProxy etc
  2. clase de expresiones regulares de gran alcance como QRegularExpression
  3. motor web decente como QtWebEngine
  4. robusto, gui madura como QWidgets
  5. La mayoría de las api Qt5 están bien diseñadas, la señal y la ranura hacen que escribir códigos asíncronos sea mucho más fácil también
  6. Gran compatibilidad con Unicode
  7. Feature rich system system library. Ya sea crear, eliminar, renombrar o encontrar ruta estándar para guardar archivos es pedazo de pastel en QT5
  8. API asíncrona de QNetworkAccessManager que sea fácil de generar demanda de carga a muchos a la vez
  9. principales plataformas de escritorio de la Cruz, Windows, OS Mac y Linux , escribe una vez compilado en cualquier lugar, solo un código.
  10. fácil de implementar en Windows y Mac (Linux? Quizá linuxdeployqt nosotros puede ahorrar toneladas de problemas)
  11. Fácil de instalar en Windows, Mac y Linux
  12. Y así sucesivamente

que ya escribió una aplicaciones de raspado de imagen de Qt5, esta aplicación puede raspar casi todas las imágenes buscadas por Google, Bing y Yahoo.

Para saber más detalles al respecto, por favor visite my github project. Escribí una descripción general de alto nivel sobre cómo recopilar datos por Qt5 en mis blogs (es demasiado largo para publicar en desbordamiento de pila).

+0

¿Por qué recomienda la versión 5.6.2 y no la última (actualmente es 5.9.0)? –

+0

@PiotrDobrogost La razón principal es que no sé cuán estable es Qt5.9.0, otra razón es que Qt5.6.2 es compatible con Windows XP – StereoMatching

Cuestiones relacionadas