• Publicidad

Procesando HTML con HTML::Parser

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-16 08:44 @405

Buenas,

teniendo el siguiente ejemplo de código HTML
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. ...
  2. <p><span class="font5" style="font-weight:bold;">Celso Barbasa</span></p>
  3. <p><span class="font1">Presidente de la Cámara de Comercios</span></p>
  4. ...
  5.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


necesito obtener los valores de los atributos "class" de cada etiqueta "span", para posteriormente agrupar los textos contenidos en cada "span".

He conseguido obtener el texto dentro de cada etiqueta "span", pero no soy capaz de obtener el valor del atributo "class".

Parte del código que estoy utilizando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # handler para el comienzo de las etiquetas
  2. sub start
  3. {
  4.        
  5.         my ($self, $tag, $attr, $attrseq, $text) = @_;
  6.        
  7.        
  8.        
  9.        
  10.         if ($tag eq "span")
  11.         {
  12.                
  13.                
  14.                 print "<p>".$tag." ".$attr->{start}."</p>";
  15.                 $span_flag = 1;
  16.                 $parte = substr($attr->{'class'}, 4);
  17.                
  18.         }
  19.         else
  20.         {
  21.                 $span_flag = 0;
  22.                
  23.         }
  24.        
  25.         if ($tag eq "a")
  26.         {
  27.                 for (keys %{$attr})
  28.                 {
  29.                         print "$_ = > $attr->{$_}";
  30.                 }
  31.         }
  32.        
  33. }
  34.  
  35. my $fichero = "../SKMBT_C22011041113360.htm";
  36. my $parser =  HTML::Parser->new( api_version => 3,
  37.                 handlers => [
  38.                         # start     => [ \&start, "tagname, attr, attrseq, text"],
  39.                         start     => [ \&start, "self, tag, attr, attrseq, text"],
  40.                         text => [ \&text, "dtext"],
  41.                         end =>[ \&end, "tagname"],
  42.                 ],
  43.                 marked_sections => 1,
  44.               );
  45. $parser->report_tags(qw(span));
  46. open (my $fh, $fichero) || die;                              
  47. $parser -> parse_file($fh);        
  48.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Quisiera saber si alguien ha tenido un problema similar, y ha conseguido resolverlo, o dónde encontrar información sobre este módulo. La documentación de CPAN está bien, pero no consigo hacerlo funcionar...

¡Muchas gracias!

Saludos.
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Publicidad

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-16 12:06 @545

Al final he conseguido obtener los valores de cada atributo "class" de las etiquetas "span" empleando el HTML::TokeParser.

Bien, ya he conseguido agrupar los textos de cada font. Ahora necesito utilizar patrones de búsqueda para clasificar los textos, por ejemplo: domingo, 24 enero 2010 --> fecha.
¿Alguna idea, documentación sobre cómo hacer esto?

Muchas gracias.

Saludos.
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Re: Procesando HTML con HTML::Parser

Notapor explorer » 2012-01-16 12:50 @576

Es cierto que el módulo HTML::Parser es un poco complicado de manejar, pues tiene pocos ejemplos claros.

Aquí te pongo una de las muchas combinaciones que se pueden hacer con ese módulo, para obtener lo que quieres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use Data::Dumper::Simple;
  8. use HTML::Parser;
  9. use autodie;
  10.  
  11. my %textos;
  12. my $clase;
  13.  
  14. sub start {
  15.     my($tag, $attr_ref, $text) = @_;
  16.  
  17. #    say "start: $tag, $attr_ref, $text";
  18.  
  19.     return if $tag ne 'span';
  20.  
  21.     if ($attr_ref->{'class'}) {
  22.         $clase = $attr_ref->{'class'};
  23. #       say "Clase: $clase";
  24.     }
  25. }
  26.  
  27. sub text {
  28.     my($texto) = @_;
  29.  
  30. #    say "text: [$texto]";
  31.     return if not $clase;
  32.  
  33.     push @{ $textos{ $clase } }, $texto;
  34.  
  35.     undef $clase;               # solo procesamos un texto cada vez
  36. }
  37.  
  38. my $parser =  HTML::Parser->new(
  39.     api_version => 3,
  40.     handlers    => {
  41.                 start => [ \&start, "tag, attr" ],
  42.                 text  => [ \&text,  "dtext"     ],
  43.     },
  44.     marked_sections => 1,
  45. );
  46. #$parser->report_tags(qw(span));    # se puede usar esta línea o el "return if $tag ne 'span'"
  47. $parser->parse_file('kk.html');
  48.  
  49. say Dumper %textos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
%textos = (
            'font5' => [
                         'Celso Barbasa'
                       ],
            'font1' => [
                         'Presidente de la Cámara de Comercios'
                       ]
          );
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En cuanto a identificar los textos, te aconsejo que mires la rama Regexp::Common.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-16 13:09 @589

¡Muchas gracias, explorer por tu ayuda!

Echaré un vistazo al módulo que comentas, aunque mi idea era crear una base de datos de patrones e irlos añadiendo a la misma, por si se me escapa alguno.

Saludos.
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-17 10:49 @492

Asociado al fichero HTML, existe un fichero CSS en el que se especifican los tipos de fuentes y tamaños. Así que una forma de clasificar cada región, sería parseando el CSS para recoger los estilos de cada class y comparando con los estilos predefinidos.

¿Alguna idea sobre algún módulo para parsear CSS?

Muchas gracias.
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Re: Procesando HTML con HTML::Parser

Notapor explorer » 2012-01-17 11:50 @535

La distribución CSS y otros más.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-17 12:47 @574

¡Gracias, explorer por tu ayuda!

Ahora me estoy peleando con CPAN y con PPM para poder instalar CSS, por ejemplo, y me muestra lo siguiente:

PPM:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. C:\xampp\perl\bin>.\ppm 
  2. PPM interactive shell (2.1.6) - type 'help' for available commands. 
  3. PPM> install CSS 
  4. Install package 'CSS?' (y/N): y 
  5. Installing package 'CSS'... 
  6. Element 'IMPLEMENTATION' cannot contain a child element 'REQUIRE' at C:/xampp/pe 
  7. rl/site/lib/PPM.pm line 1677, <> line 2. 
  8. Can't locate object method "rvalidate" via package "PPM::XML::PPD::REQUIRE" at C 
  9. :/xampp/perl/site/lib/PPM/XML/ValidatingElement.pm line 38, <> line 2. 


CPAN:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. C:\xampp\perl\bin>.\cpan 
  2. Terminal does not support AddHistory. 
  3.  
  4. cpan shell -- CPAN exploration and modules installation (v1.9402) 
  5. Enter 'h' for help. 
  6.  
  7. cpan[1]> install CSS 
  8. CPAN: Storable loaded ok (v2.21) 
  9. Going to read 'C:\xampp\perl\bin\.cpan\Metadata' 
  10.  Database was generated on Tue, 17 Jan 2012 07:12:21 GMT 
  11. Running install for module 'CSS' 
  12. CPAN: Data::Dumper loaded ok (v2.124) 
  13. 'YAML' not installed, falling back to Data::Dumper and Storable to read prefs 'C 
  14. :\xampp\perl\bin\.cpan\prefs' 
  15. Running make for I/IA/IAMCAL/CSS-1.09.tar.gz 
  16. CPAN: Digest::SHA loaded ok (v5.47) 
  17. CPAN: Compress::Zlib loaded ok (v2.02) 
  18. Checksum for C:\xampp\perl\bin\.cpan\sources\authors\id\I\IA\IAMCAL\CSS-1.09.tar 
  19. .gz ok 
  20. Scanning cache C:\xampp\perl\bin\.cpan\build for sizes 
  21. ............................................................................DONE 
  22.  
  23. CPAN: Archive::Tar loaded ok (v1.52) 
  24. CSS-1.09/ 
  25. CSS-1.09/Changes 
  26. CSS-1.09/META.yml 
  27. CSS-1.09/t/ 
  28. CSS-1.09/t/harness_adaptor 
  29. CSS-1.09/t/harness_parse 
  30. CSS-1.09/t/03_parse_heavy.t 
  31. CSS-1.09/t/css_tiny 
  32. CSS-1.09/t/05_search.t 
  33. CSS-1.09/t/css_selectors 
  34. CSS-1.09/t/07_adaptor_pretty.t 
  35. CSS-1.09/t/02_parse_lite.t 
  36. CSS-1.09/t/css_selector_groups 
  37. CSS-1.09/t/css_oddities 
  38. CSS-1.09/t/04_parse_compiled.t 
  39. CSS-1.09/t/08_adaptor_debug.t 
  40. CSS-1.09/t/css_simple 
  41. CSS-1.09/t/01_basic.t 
  42. CSS-1.09/t/06_adaptor_simple.t 
  43. CSS-1.09/README 
  44. CSS-1.09/CSS/ 
  45. CSS-1.09/CSS/Adaptor.pm 
  46. CSS-1.09/CSS/Style.pm 
  47. CSS-1.09/CSS/Parse.pm 
  48. CSS-1.09/CSS/Parse/ 
  49. CSS-1.09/CSS/Parse/Heavy.pm 
  50. CSS-1.09/CSS/Parse/Lite.pm 
  51. CSS-1.09/CSS/Parse/PRDGrammar.pm 
  52. CSS-1.09/CSS/Parse/Compiled.pm 
  53. CSS-1.09/CSS/Parse/CompiledGrammar.pm 
  54. CSS-1.09/CSS/Property.pm 
  55. CSS-1.09/CSS/Selector.pm 
  56. CSS-1.09/CSS/Adaptor/ 
  57. CSS-1.09/CSS/Adaptor/Debug.pm 
  58. CSS-1.09/CSS/Adaptor/Pretty.pm 
  59. CSS-1.09/CSS/Value.pm 
  60. CSS-1.09/Makefile.PL 
  61. CSS-1.09/CSS.pm 
  62. CSS-1.09/examples/ 
  63. CSS-1.09/examples/adapt.pl 
  64. CSS-1.09/examples/parsers.pl 
  65. CSS-1.09/examples/dump.pl 
  66. CSS-1.09/MANIFEST 
  67. CPAN: File::Temp loaded ok (v0.22) 
  68. Warning (usually harmless): 'YAML' not installed, will not store persistent stat 
  69.  
  70.  CPAN.pm: Going to build I/IA/IAMCAL/CSS-1.09.tar.gz 
  71.  
  72. Checking if your kit is complete... 
  73. Looks good 
  74. Writing Makefile for CSS 
  75. Could not read 'C:\xampp\perl\bin\.cpan\build\CSS-1.09-yCywt0\META.yml'. Falling 
  76. back to other methods to determine prerequisites 
  77. "nmake.exe" no se reconoce como un comando interno o externo, 
  78. programa o archivo por lotes ejecutable. 
  79.  IAMCAL/CSS-1.09.tar.gz 
  80.  nmake.exe -- NOT OK 
  81. Warning (usually harmless): 'YAML' not installed, will not store persistent stat 
  82. Running make test 
  83.  Can't test without successful make 
  84. Running make install 
  85.  Make had returned bad status, install seems impossible 
  86. Failed during this command: 
  87. IAMCAL/CSS-1.09.tar.gz            : make NO 


¿Alguna idea de cómo instalarlo?

¡Muchas gracias!
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-17 13:13 @592

Listo, primero instalé el YAML desde PPM y no me dio ningún problema.

Seguidamente, instalé CSS empleando lo siguiente, dentro de la carpeta de /.cpan/build/CSS...:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
perl Makefile.PL
nmake
nmake test
nmake install
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


perl y nmake son los que trae Xampp.

Ahora a probar el módulo.
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Re: Procesando HTML con HTML::Parser

Notapor explorer » 2012-01-17 14:54 @662

JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesando HTML con HTML::Parser

Notapor _snake_ » 2012-01-18 13:36 @608

¡¡¡Muchas gracias, explorer!!! ¡¡¡Pedazo guía!!!

Por desgracia, XAMPP no tiene el PPM gráfico...
_snake_
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-05-04 05:17 @261

Siguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron