Foros del Web » Programando para Internet » PHP »

Como extraer secciones de texto de un html o txt?

Estas en el tema de Como extraer secciones de texto de un html o txt? en el foro de PHP en Foros del Web. Buenas amigos! Tengo un problema y es que no puedo dar con la resolución del siguiente problema. necesito crear un .php que pueda tomar un ...
  #1 (permalink)  
Antiguo 05/10/2011, 08:02
 
Fecha de Ingreso: diciembre-2001
Ubicación: Mar del Plata
Mensajes: 203
Antigüedad: 23 años
Puntos: 0
Como extraer secciones de texto de un html o txt?

Buenas amigos! Tengo un problema y es que no puedo dar con la resolución del siguiente problema. necesito crear un .php que pueda tomar un archivo .html ó .txt como el citado aquí abajo y extraer todo lo que esta entre los caracteres "##" de modo que pueda con el resultado generar un archivo .txt que quede de la siguiente manera:

archivo.html ó archivo.txt:

Código HTML:
<HTML>
<HEAD>
<META NAME="GENERATOR "CONTENT="ENPS">
<META CONTENT="text/html;charset=utf-16" http-equiv=Content-Type>
<TITLE>TELEOCHO SEGUNDA</TITLE>
</HEAD>
<BODY BGPROPERTIES=FIXED>
<A NAME=StoryIndex>
<CENTER>
<H2>TELEOCHO SEGUNDA</H2>
<A HREF="teleocho segunda 4-10 vale.html">Click here for a full graphical version of this page</A><BR>
</CENTER>
<UL>
<LI><A HREF=#IMAGEN ESCUELA ATACADA-COLAS>IMAGEN ESCUELA ATACADA-COLAS</A>
<LI><A HREF=#VENTA 1 NUEVO RECLAMO-COLAS>VENTA 1 NUEVO RECLAMO-COLAS</A>
<LI><A HREF=#VENTA 2 QUEJAS EN LA ESTACION-COLAS>VENTA 2 QUEJAS EN LA ESTACION-COLAS</A>
<LI><A HREF=#VENTA 3 FINAL DE LOS JUEGOS-COLAS>VENTA 3 FINAL DE LOS JUEGOS-COLAS</A>
<LI><A HREF=#24429 ESCUELA ATACADA-INTRO>24429 ESCUELA ATACADA-INTRO</A>
<LI><A HREF=#24419 ENTREGA ARMAS EL GAUCHO OFF VIVO-INTRO>24419 ENTREGA ARMAS EL GAUCHO OFF VIVO-INTRO</A>
<LI><A HREF=#244428 SIMBOLO DE VICTIMAS-INTRO>244428 SIMBOLO DE VICTIMAS-INTRO</A>
<LI><A HREF=#24418 JUICIO QUEMADA-INTRO>24418 JUICIO QUEMADA-INTRO</A>
<LI><A HREF=#24417 MENORES ENTREGADOS-INTRO>24417 MENORES ENTREGADOS-INTRO</A>
<LI><A HREF=#CHORRO FACEBOOK-VTR>CHORRO FACEBOOK-VTR</A>
<LI><A HREF=#CHORRO FACEBOOK-INTRO>CHORRO FACEBOOK-INTRO</A>
<LI><A HREF=#MOVIL SOBRERO-INTRO>MOVIL SOBRERO-INTRO</A>
<LI><A HREF=#MOVIL SOBRERO-VIVO>MOVIL SOBRERO-VIVO</A>
<LI><A HREF=#POLLO LIBERADO-INTRO>POLLO LIBERADO-INTRO</A>
<LI><A HREF=#POLLO LIBERADO-VTR>POLLO LIBERADO-VTR</A>
<LI><A HREF=#24427 SCOLA EN BONAERENSES-INTRO>24427 SCOLA EN BONAERENSES-INTRO</A>
<LI><A HREF=#24425 ALQUILERES COMERCIOS-INTRO>24425 ALQUILERES COMERCIOS-INTRO</A>
<LI><A HREF=#24426 COMPACTO ELECCIONES-INTRO>24426 COMPACTO ELECCIONES-INTRO</A>
<LI><A HREF=#24416 TORNEOS ABUELOS-INTRO>24416 TORNEOS ABUELOS-INTRO</A>
<LI><A HREF=#24415 TREN ROTO-INTRO>24415 TREN ROTO-INTRO</A>
<LI><A HREF=#24414 ENERGIA EOLICA-INTRO>24414 ENERGIA EOLICA-INTRO</A>
<LI><A HREF=#24413 MICRO KALERGUIZ-INTRO>24413 MICRO KALERGUIZ-INTRO</A>
</UL>
<HR>
</CENTER><HR><BR>
<A NAME=IMAGEN ESCUELA ATACADA-COLAS>
<H3>IMAGEN ESCUELA ATACADA-COLAS</H3><BR></DIV><DIV DIR=LTR>
<P>##IMAGEN
<P>ESCUELA ATACADA
<P>##


<FONT 000000 SIZE=-2><A HREF=#StoryIndex>Return to index of stories...</FONT></A><BR CLEAR=LEFT>
<HR></DIV>
<A NAME=VENTA 1 NUEVO RECLAMO-COLAS>
<H3>VENTA 1 NUEVO RECLAMO-COLAS</H3><BR></DIV><DIV DIR=LTR>
<P>##VENTA 1
<P>NUEVO RECLAMO
<P>##


<FONT 000000 SIZE=-2><A HREF=#StoryIndex>Return to index of stories...</FONT></A><BR CLEAR=LEFT>
<HR></DIV>
<A NAME=VENTA 2 QUEJAS EN LA ESTACION-COLAS>
<H3>VENTA 2 QUEJAS EN LA ESTACION-COLAS</H3><BR></DIV><DIV DIR=LTR>
<P>##VENTA 2
<P>QUEJAS EN LA ESTACIÓN
<P>##


</BODY>
</HTML> 

resultado deseado en resultado.txt:

Cita:
##IMAGEN
ESCUELA ATACADA
##

##VENTA 1
NUEVO RECLAMO
##

##VENTA 2
QUEJAS EN LA ESTACIÓN
##
Desde ya muchas gracias! Estóy empantanado o me perdí con la solución y no se para donda apuntar!!!
__________________
:) Fernando Dichiera (:
[email protected]
  #2 (permalink)  
Antiguo 05/10/2011, 08:15
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 4 meses
Puntos: 194
Respuesta: Como extraer secciones de texto de un html o txt?

El formato del archivo que lees es sumamente extraño, no existe manera que puedas cambiar este formato a algo mas simple?

De no ser posible, tendrías q parsear con una regular expresión el texto.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 05/10/2011, 08:37
 
Fecha de Ingreso: diciembre-2001
Ubicación: Mar del Plata
Mensajes: 203
Antigüedad: 23 años
Puntos: 0
Respuesta: Como extraer secciones de texto de un html o txt?

Lamentablemente el formato del archivo original no puedo manekarlo ya que lo genera un programa que tienen como única opción de exporta en ese raro .html!

El problema radica en que se me está complicando entender el tema de parsear con las expresiones regulares, tendría que ver algún ejemplo claro como para poder empezar a hacerme la idea de como trabajar este archivo .html y lograr mi preciado .txt!!!
__________________
:) Fernando Dichiera (:
[email protected]
  #4 (permalink)  
Antiguo 05/10/2011, 09:57
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Como extraer secciones de texto de un html o txt?

Puedes obtener el contenido de casi todo con la clase DOMDocument. Pero no se como se comporte con esos párrafos que nisiquiera tienen etiqueta de cierre... A quien se le ocurre un html así por otro lado una expresión regular te puede funcionar, que coja lo que esté adentro de ## y # no es muy dificil. Te recomiendo este apar de aportes:

[APORTE] Expresiones PCRE
[APORTE] Leer XML con SimpleXML y DOM
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 05/10/2011, 10:04
Avatar de Artificium  
Fecha de Ingreso: enero-2011
Mensajes: 492
Antigüedad: 13 años, 11 meses
Puntos: 81
Respuesta: Como extraer secciones de texto de un html o txt?

También podrías intentar subsanar ese HTML anacrónico mediante tidy en php, luego usas DOM o SimpleXML para parsearlo. Suerte!
  #6 (permalink)  
Antiguo 05/10/2011, 13:27
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Como extraer secciones de texto de un html o txt?

He estado jugando un poco con el código, usando tidy como dice Artificium, coloco lo que hice:

Código PHP:
Ver original
  1. <?php
  2. $config = array('indent' => true, 'output-xhtml' => true, 'wrap' => 200);
  3.  
  4. $t = new tidy();
  5. $t->parseString($html, $config, 'utf8');
  6. $t->cleanRepair();
  7.  
  8. $doc = new DOMDocument();
  9. $doc->loadHTML($t);
  10. $divs = $doc->getElementsByTagName('div');
  11.  
  12. for ($i = 0; $i < $divs->length; $i++) {
  13.     $pc = $divs->item($i)
  14.                ->getElementsByTagName('p')
  15.                ->item(2);
  16.     $font = $pc->getElementsByTagName('font')->item(0);
  17.     if ($font != null) {
  18.         $pc->removeChild($font);
  19.     }
  20.     $p = $divs->item($i)->getElementsByTagName('p');
  21.     for ($j = 0; $j < $p->length; $j++) {
  22.         echo $divs->item($i)
  23.                   ->getElementsByTagName('p')
  24.                   ->item($j)
  25.                   ->nodeValue . '<br />';
  26.     }
  27.     echo '<br />';
  28. }
Faltan algunas validaciones y puede que se puede hacer de mejor forma y más simplificado, pero funciona con el HTML del post. Espero que te sirva o le sirva a alguién más.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 05/10/2011, 21:46
 
Fecha de Ingreso: diciembre-2001
Ubicación: Mar del Plata
Mensajes: 203
Antigüedad: 23 años
Puntos: 0
Respuesta: Como extraer secciones de texto de un html o txt?

Sin llegar a usar tidy existe alguna función que lea todo el html y solo extraiga lo que esta entre los símbolos ## de comienzo y final? es decir extraer solo por ejemplo esto:

##tal cosa
texto texto de ejemplo
##

##tal otra
otro texto de ejemplo
##
__________________
:) Fernando Dichiera (:
[email protected]
  #8 (permalink)  
Antiguo 05/10/2011, 21:53
Avatar de perrucis  
Fecha de Ingreso: septiembre-2011
Mensajes: 24
Antigüedad: 13 años, 2 meses
Puntos: 1
Respuesta: Como extraer secciones de texto de un html o txt?

expresiones regulares :/
  #9 (permalink)  
Antiguo 05/10/2011, 22:56
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Como extraer secciones de texto de un html o txt?

Claro ahi tienes para que aprendas y lo hagas:

[APORTE] Expresiones PCRE
Expresiones regulares en PHP
Expresiones Regulares Manual PHP
Manual completo y sencillo de Expresiones Regulares en PHP

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #10 (permalink)  
Antiguo 09/10/2011, 18:26
 
Fecha de Ingreso: diciembre-2001
Ubicación: Mar del Plata
Mensajes: 203
Antigüedad: 23 años
Puntos: 0
Respuesta: Como extraer secciones de texto de un html o txt?

Gracias a sus aportes, y a leer mucho e investigar un poco llegue a la siguiente respuesta, tan solo me falta poder "recorrer" todo el texto original para obtener todas las veces que aparece textos entre ## dado que ahora solo obtengo la primer aparición de los mismos, entiendo que tendría que realizar un bucle pero no termino de darme cuenta como implementarlo con lo que he realizado hasta ahora. Si alguien fuera tan amable de ayudarme a pensar o mostrarme un ejemplo se lo agradesería mucho porque solo me falta eso para poder concretar esta función.

desde ya muchas gracias!!!

El .php que realize hasta ahora y que me da tan solo la primera aparición del ##text##

Código PHP:
<?php

$archivo_html 
'8.HTML'// archivo HTML a procesar
$archivo_txt "script "date("Y-m-d H.i.s").".txt"// nombre del archivo donde se generará el txt con el contenido deseado

$contenido_con_etiquetas_html file_get_contents("$archivo_html"); // leo el contenido del archivo y lo pongo en una variable

$contenido_a_filtrar =  strip_tags($contenido_con_etiquetas_html);// obtengo el contenido del archivo sin las etiquetas HTML

// Función para extrear el texto en base a el patron dado como inicio y final
function extraer($Contenido$Inicio$Final){
        
$pInicio strpos($Contenido$Inicio0);
        if (
$pInicio !== false){
                
$pFinal strpos($Contenido$Final$pInicio strlen($Inicio));
                if (
$pFinal !== false) {
                        return (
substr($Contenido$pInicio strlen($Inicio), ($pFinal - ($pInicio strlen($Inicio)))));
                }
        }
        return 
'';
}

$contenido_filtrado extraer($contenido_a_filtrar,"##","##"); // Filtro el contenido de texto comprendido entre los caracteres "##" de apertura y cierre

//Generación del .txt final
if ($fp fopen($archivo_txt,w))
{
fputs($fp$contenido_filtrado);
}
fclose($fp);

?>
__________________
:) Fernando Dichiera (:
[email protected]
  #11 (permalink)  
Antiguo 09/10/2011, 18:48
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Como extraer secciones de texto de un html o txt?

No creo que sea tan necesaria tanta vuelta:

Código PHP:
Ver original
  1. //Quitamos las etiquetas html del archivo
  2. $re = strip_tags($html);
  3. //Capturamos todo lo que esté entre ## y ## con .* y el signo ?
  4. //para que capture entre cada párrafo y no se vaya del primero al último.
  5. //(la letra i para que no importe si son mayúsculas y mayúsculas
  6. //y la letra s para que capture las nuevas líneas).
  7. preg_match_all('/##(.*?)##/is', $re, $parrafos);
  8.  
  9. //Recorremos todos los párrafos, en tu caso debes agregarlo al nuevo txt.
  10. //Usé nl2br para convertir los saltos de línea opcionalmente
  11. foreach ($parrafos[0] as $p) {
  12.     echo nl2br($p) . '<br /><br />';
  13. }

Resultado:

Cita:
##IMAGEN
ESCUELA ATACADA
##

##VENTA 1
NUEVO RECLAMO
##

##VENTA 2
QUEJAS EN LA ESTACIÓN
##
Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #12 (permalink)  
Antiguo 09/10/2011, 22:15
 
Fecha de Ingreso: diciembre-2001
Ubicación: Mar del Plata
Mensajes: 203
Antigüedad: 23 años
Puntos: 0
Respuesta: Como extraer secciones de texto de un html o txt?

Muchisimas gracias andresdzphp por la ayuda, aquí dejo el resultado al que llegue, quizas no es la solución mas elegante pero funciona!!! al final como me pidieron de apuro que los caracteres ## tampoco figuren en el archivo final use ereg_replace para sacarlos.

Gracias a todos!

Código PHP:
// archivo HTML a procesar
$archivo_html '8.HTML'

// nombre del archivo donde se generará el txt con el contenido deseado
$archivo_txt "script "date("Y-m-d H.i.s").".txt"

// leo el contenido del archivo y lo pongo en una variable
$contenido_con_etiquetas_html file_get_contents("$archivo_html"); 

// obtengo el contenido del archivo sin las etiquetas HTML
$contenido_a_filtrar =  strip_tags($contenido_con_etiquetas_html);

// Mediante Expresiones Regulares dejo lo que esta entre los delimitadores ##
//(gracias andresdzphp)
preg_match_all('/##(.*?)##/is'$contenido_a_filtrar$parrafos); 
 
//Generación del .txt final
foreach ($parrafos[0] as $p) {

if (
$fp fopen($archivo_txta))
{
fputs($fpereg_replace("##","",($p)) ."\r\n"."\r\n"."\r\n"."\r\n");
}
}

fclose($fp); 
__________________
:) Fernando Dichiera (:
[email protected]
  #13 (permalink)  
Antiguo 09/10/2011, 23:02
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Como extraer secciones de texto de un html o txt?

Bueno con un str_replace era más que suficiente. Te recomiendo que no uses la función ereg_replace.

Cita:
Esta función ha sido declarada OBSOLETA desde PHP 5.3.0. Su uso está totalmente desaconsejado.
en su lugar se usa preg_replace.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: html, secciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:00.