Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-03-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Parsear HTML

Hola, llevo un buen rato buscando la mejor manera de parsear contenido de un fichero HTML.

Lo que necesito es extraer las rutas de las imágenes <img src="http://SITIO/IMAGEN.JPG"> de un fichero HTML que descargo.

En PHP o Perl creo recordar que era bastante sencillo con las expresiones regulares pero en C.... me muero... Se os ocurre algo?

Gracias y un saludo!
Responder Con Cita
  #2  
Antiguo 23-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Extraer http://SITIO/IMAGEN.JPG ?
Responder Con Cita
  #3  
Antiguo 23-03-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Hola Casimiro, exacto, de un HTML que guardo en un memo por ejemplo.

Código PHP:
<html>
<
head><title> </head></title>
<
body>

<
p>
Lalalala
<img src="http://www.loquesea.com/imagen1.jpg">
<
img src="http://www.loquesea.com/imagen2.jpg">
<
img src="http://www.loquesea.com/imagen3.jpg">
</
p>

</
body>

</
html
De ahi necesito recoger:
http://www.loquesea.com/imagen1.jpg
http://www.loquesea.com/imagen2.jpg
http://www.loquesea.com/imagen3.jpg
Responder Con Cita
  #4  
Antiguo 23-03-2018
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.202
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Código PHP:
AnsiString ExtractURLImages(AnsiString Text)
{
  
AnsiString Result;
  
CHAR *Text.c_str();

  
CHARstrstr(T".jpg");
  while(
R){
     
R[4] = 0;
     
strrchr(T'\"');
     if(
TResult += T+1;
     
Result += "\n";
     
R+5;
     
strstr(T".jpg");
  }
  return 
Result;

Ejemplo de uso:

Código PHP:
Memo->Text ExtractURLImages(HTML_Text); 

Saludos.
Responder Con Cita
  #5  
Antiguo 24-03-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Muchas gracias Escafandra, en página más complejas falla pero me da por donde arrancar!
Responder Con Cita
  #6  
Antiguo 24-03-2018
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.202
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por lago Ver Mensaje
Muchas gracias Escafandra, en página más complejas falla pero me da por donde arrancar!
El código asume que las URLs buscadas están entre paréntesis, y se refieren a imágenes jpg.
Puede añadirse la búsqueda de otros formatos de imagen y que el comienzo de la cadena buscada sea por "http://www."

Saludos.
Responder Con Cita
  #7  
Antiguo 24-03-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por lago Ver Mensaje
Muchas gracias Escafandra, en página más complejas falla pero me da por donde arrancar!
HTML no es para parsear con regex ni manualmente:

https://stackoverflow.com/questions/...lanation-in-la

a menos que tengas MUY especificado que es lo que quieres.

---

Si de todas maneras es solo detectar las URLS necesitas hacer un regex mas complejo o el parseo manual es mucho mas trabajado.
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 26-03-2018
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.003
Poder: 26
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Como te han dicho, analizar código HTML es complejo, y más si quieres cumplir con la norma de forma estricta y manejar correctamente código HTML mal construido. Es más, para hacerlo bien tendrás que construir un parser completo.

De todas formas, puedes simplificar un poco la cosa. Te lo pongo en pseudo-código:
Código:
  BUCLE
    SI se encuentra "<img " en HTML
       Desde esa posición, buscar 'src="', si no se encuentra ERROR
       Extraer el texto desde esa posición hasta las siguientes comillas
       quitar de HTML todo lo que preceda al texto extraido
    SINO
      Salir del BUCLE
    FIN SI
  REPETIR
Sigue sin manejar bien código mal formado (por ejemplo, si se encuentra un <img /> sin "src") pero en los casos bien construidos debería funcionar.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #9  
Antiguo 27-03-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por lago Ver Mensaje
...
Lo que necesito es extraer las rutas de las imágenes <img src="http://SITIO/IMAGEN.JPG"> de un fichero HTML que descargo.
...
Otra opción para extraer las rutas bajo la condición que las cadenas comiencen en "<img src=" y terminen en "jpg">:
Código PHP:
void getUrls(TStrings *sourceTStrings *target)
{
  const 
charINI "<img src=\"";
  const 
charFIN "jpg\">";

  
target->Clear();
  
TStrings *ori = new TStringList;
  try
  {
    
ori->Text source->Text;
    for ( 
int i 0ori->Counti++ )
    {
      
AnsiString aux ori->Strings[i];
      
int p aux.Pos(INI);
      if ( 
)
      {
        
+= strlen(INI) - 1;
        
aux aux.SubString(p+1aux.Length());
        
aux aux.SubString(1aux.Pos(FIN) + 2);
        
target->Add(aux);
      }
    }
  }
  
__finally
  
{
    
delete(ori);
  }

Ej. uso:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
getUrls(Memo1->LinesMemo2->Lines); 

Resultado de la prueba:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 27-03-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Si que es cierto lo que decís, es peliagudo parsear una codificación que aún teniendo un standar es flexible como para que cada uno lo haga como le da la gana. En este caso me metí en este jardín por que solo tengo que parsear la salida html de dos páginas muy concretas.

Ecfisa muchas gracias por tu código, junto con el de escafandra me han venido genial!

Muchas gracias a todos por vuestras respuestas

Un saludo!!

Jorge.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Parsear contenido HTML lsanchez Delphi para la web 3 12-08-2015 16:56:32
Parsear datos de un Memo ZayDun Varios 5 11-10-2013 01:24:30
Parsear texto con TString avechuche Varios 9 04-07-2013 10:57:24
Como "parsear" un fichero HTML con Delphi cartmanrules Varios 3 28-09-2007 08:59:42
parsear xml + clase DOMParser gustavoh JAVA 0 27-07-2006 16:39:25


La franja horaria es GMT +2. Ahora son las 01:18:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi