• Publicidad

De HTML a TXT o XML

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

De HTML a TXT o XML

Notapor boligan » 2017-06-14 12:26 @560

Hola. Estoy tratando de extraer datos que están en dos tablas que pertenecen a una página html que tengo guardada en local o sea en mi computadora y pasarlos a XML pero no logro avanzar.

Soy nuevo en Perl y no me empato con la solución. Si pudieran ayudarme se los agradecería. La cuestión es tomar los valores de cada Variable(Promedio,Mínimo,Máximo) y ponerlos en un xml, o sea, algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <Data Variable="Temperatura del aire" Unit="°C" Value="25.4" DateTime="" Type="Promedio" />
  2. <Data Variable="Temperatura del aire" Unit="°C" Value="22.2" DateTime="04:50" Type="Mínimo" />
  3. <Data Variable="Temperatura del aire" Unit="°C" Value="30.9" DateTime="12:10" Type="Máximo" />
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto lo haría para cada una de las variables. Sin más, espero puedan ayudarme, he tratado de subir la página pero no me lo permite la seguridad, aquí les pego el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="description" content="Description" /><meta name="keywords" content="Keywords" /><title>
  5.  
  6. </title><link rel="stylesheet" href="http://10.0.4.22/santalucia/style.css" type="text/css" media="screen" />
  7.  
  8. </head>
  9. <body>
  10.         <div id="art-main">
  11.             <div class="cleared reset-box"></div>
  12.  
  13.         <div class="cleared reset-box"></div>
  14.         <div class="art-box art-sheet">
  15.             <div class="art-box-body art-sheet-body">
  16.  
  17.                 <div class="cleared reset-box"></div>
  18.                 <div class="art-layout-wrapper">
  19.                     <div class="art-content-layout">
  20.                         <div class="art-content-layout-row">
  21.                             <div class="art-layout-cell art-content">
  22.                                 <div class="art-box art-post">
  23.                                     <div class="art-box-body art-post-body">
  24.                                         <div class="art-post-inner art-article">
  25.                                             <div class="art-postcontent">
  26.  
  27.     <h1>
  28.         Inicio
  29.     </h1>
  30.     <div id="ContentPlaceHolder1_UpdatePanel1">
  31.  
  32.             <span id="ContentPlaceHolder1_Timer1" style="display:none;"></span>
  33.             <table>
  34.                 <tr>
  35.                     <td style="border-style:hidden">
  36.                         <table>
  37.                             <tr>
  38.                                 <td style="border-style:hidden;text-align:center">
  39.                                     <span id="ContentPlaceHolder1_lastDate"><b>14 de junio de 2017 07:50</b></span>
  40.                                 </td>
  41.                             </tr>
  42.                             <tr>
  43.                                 <td style="border-style:hidden;text-align:center">
  44.                                     <span id="ContentPlaceHolder1_Label1"><font color="Red">Ahora</font></span>
  45.                                 </td>
  46.                             </tr>
  47.                             <tr>
  48.                                 <td style="border-style:hidden">
  49.  
  50.                                             <table id="ContentPlaceHolder1_lastVal_table1">
  51.  
  52.  
  53.                                             <table>
  54.                                                 <tr>
  55.                                                     <td style="width:250px;text-align:center">
  56.                                                         <span id="ContentPlaceHolder1_lastVal_W_0">Variable</span>
  57.                                                     </td>
  58.                                                     <td style="width:130px;text-align:center">
  59.                                                         <span id="ContentPlaceHolder1_lastVal_X_0">Promedio</span>
  60.                                                     </td>
  61.                                                     <td style="width:130px;text-align:center">
  62.                                                         <span id="ContentPlaceHolder1_lastVal_Y_0">Mínimo</span>
  63.                                                     </td>
  64.                                                     <td style="width:130px;text-align:center">
  65.                                                         <span id="ContentPlaceHolder1_lastVal_Z_0">Máximo</span>
  66.                                                     </td>
  67.                                                 </tr>
  68.                                             </table>
  69.  
  70.  
  71.                                             <table>
  72.                                                 <tr>
  73.                                                     <td style="width:250px;text-align:center">
  74.                                                         <span id="ContentPlaceHolder1_lastVal_W_1">Temperatura del aire (°C)</span>
  75.                                                     </td>
  76.                                                     <td style="width:130px;text-align:center">
  77.                                                         <span id="ContentPlaceHolder1_lastVal_X_1">27.4</span>
  78.                                                     </td>
  79.                                                     <td style="width:130px;text-align:center">
  80.                                                         <span id="ContentPlaceHolder1_lastVal_Y_1">27.1</span>
  81.                                                     </td>
  82.                                                     <td style="width:130px;text-align:center">
  83.                                                         <span id="ContentPlaceHolder1_lastVal_Z_1">27.8</span>
  84.                                                     </td>
  85.                                                 </tr>
  86.                                             </table>
  87.  
  88.  
  89.                                             <table>
  90.                                                 <tr>
  91.                                                     <td style="width:250px;text-align:center">
  92.                                                         <span id="ContentPlaceHolder1_lastVal_W_2">Humedad relativa (%)</span>
  93.                                                     </td>
  94.                                                     <td style="width:130px;text-align:center">
  95.                                                         <span id="ContentPlaceHolder1_lastVal_X_2">81.5</span>
  96.                                                     </td>
  97.                                                     <td style="width:130px;text-align:center">
  98.                                                         <span id="ContentPlaceHolder1_lastVal_Y_2">78.2</span>
  99.                                                     </td>
  100.                                                     <td style="width:130px;text-align:center">
  101.                                                         <span id="ContentPlaceHolder1_lastVal_Z_2">84.2</span>
  102.                                                     </td>
  103.                                                 </tr>
  104.                                             </table>
  105.  
  106.  
  107.                                             <table>
  108.                                                 <tr>
  109.                                                     <td style="width:250px;text-align:center">
  110.                                                         <span id="ContentPlaceHolder1_lastVal_W_3">Velocidad del Viento (m/s)</span>
  111.                                                     </td>
  112.                                                     <td style="width:130px;text-align:center">
  113.                                                         <span id="ContentPlaceHolder1_lastVal_X_3">1.3</span>
  114.                                                     </td>
  115.                                                     <td style="width:130px;text-align:center">
  116.                                                         <span id="ContentPlaceHolder1_lastVal_Y_3">0.3</span>
  117.                                                     </td>
  118.                                                     <td style="width:130px;text-align:center">
  119.                                                         <span id="ContentPlaceHolder1_lastVal_Z_3">2.3</span>
  120.                                                     </td>
  121.                                                 </tr>
  122.                                             </table>
  123.  
  124.  
  125.                                             <table>
  126.                                                 <tr>
  127.                                                     <td style="width:250px;text-align:center">
  128.                                                         <span id="ContentPlaceHolder1_lastVal_W_4">Dirección del Viento (°)</span>
  129.                                                     </td>
  130.                                                     <td style="width:130px;text-align:center">
  131.                                                         <span id="ContentPlaceHolder1_lastVal_X_4">93.7 (E) </span>
  132.                                                     </td>
  133.                                                     <td style="width:130px;text-align:center">
  134.                                                         <span id="ContentPlaceHolder1_lastVal_Y_4"></span>
  135.                                                     </td>
  136.                                                     <td style="width:130px;text-align:center">
  137.                                                         <span id="ContentPlaceHolder1_lastVal_Z_4"></span>
  138.                                                     </td>
  139.                                                 </tr>
  140.                                             </table>
  141.  
  142.  
  143.                                             <table>
  144.                                                 <tr>
  145.                                                     <td style="width:250px;text-align:center">
  146.                                                         <span id="ContentPlaceHolder1_lastVal_W_5">Presión atmosférica (hPa)</span>
  147.                                                     </td>
  148.                                                     <td style="width:130px;text-align:center">
  149.                                                         <span id="ContentPlaceHolder1_lastVal_X_5">1012.7</span>
  150.                                                     </td>
  151.                                                     <td style="width:130px;text-align:center">
  152.                                                         <span id="ContentPlaceHolder1_lastVal_Y_5">1012.6</span>
  153.                                                     </td>
  154.                                                     <td style="width:130px;text-align:center">
  155.                                                         <span id="ContentPlaceHolder1_lastVal_Z_5">1013.0</span>
  156.                                                     </td>
  157.                                                 </tr>
  158.                                             </table>
  159.  
  160.  
  161.                                             <table>
  162.                                                 <tr>
  163.                                                     <td style="width:250px;text-align:center">
  164.                                                         <span id="ContentPlaceHolder1_lastVal_W_6">Radiación Global (W/m²)</span>
  165.                                                     </td>
  166.                                                     <td style="width:130px;text-align:center">
  167.                                                         <span id="ContentPlaceHolder1_lastVal_X_6">297.5</span>
  168.                                                     </td>
  169.                                                     <td style="width:130px;text-align:center">
  170.                                                         <span id="ContentPlaceHolder1_lastVal_Y_6">277.4</span>
  171.                                                     </td>
  172.                                                     <td style="width:130px;text-align:center">
  173.                                                         <span id="ContentPlaceHolder1_lastVal_Z_6">314.5</span>
  174.                                                     </td>
  175.                                                 </tr>
  176.                                             </table>
  177.                                         </table>
  178.  
  179.  
  180.                                 </td>
  181.                             </tr>
  182.                         </table>
  183.                     </td>
  184.                 </tr>
  185.                 <tr>
  186.                     <td style="border-style:hidden">
  187.                         <table>
  188.                             <tr>
  189.                                 <td style="border-style:hidden;text-align:center">
  190.                                     <span id="ContentPlaceHolder1_todayLabel"><font color="Red">Hoy</font></span>
  191.                                 </td>
  192.                             </tr>
  193.                             <tr>
  194.                                 <td style="border-style:hidden">
  195.  
  196.                                             <table id="ContentPlaceHolder1_lastDay_table2">
  197.  
  198.  
  199.                                             <table>
  200.                                                 <tr>
  201.                                                     <td style="width:250px;text-align:center">
  202.                                                         <span id="ContentPlaceHolder1_lastDay_W1_0">Variable</span>
  203.                                                     </td>
  204.                                                     <td style="width:130px;text-align:center">
  205.                                                         <span id="ContentPlaceHolder1_lastDay_X1_0">Promedio</span>
  206.                                                     </td>
  207.                                                     <td style="width:130px;text-align:center">
  208.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_0">Mínimo</span>
  209.                                                     </td>
  210.                                                     <td style="width:130px;text-align:center">
  211.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_0">Máximo</span>
  212.                                                     </td>
  213.                                                 </tr>
  214.                                             </table>
  215.  
  216.  
  217.                                             <table>
  218.                                                 <tr>
  219.                                                     <td style="width:250px;text-align:center">
  220.                                                         <span id="ContentPlaceHolder1_lastDay_W1_1">Temperatura del aire (°C)</span>
  221.                                                     </td>
  222.                                                     <td style="width:130px;text-align:center">
  223.                                                         <span id="ContentPlaceHolder1_lastDay_X1_1">23.4</span>
  224.                                                     </td>
  225.                                                     <td style="width:130px;text-align:center">
  226.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_1">22.2 (04:50)</span>
  227.                                                     </td>
  228.                                                     <td style="width:130px;text-align:center">
  229.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_1">28.0 (08:00)</span>
  230.                                                     </td>
  231.                                                 </tr>
  232.                                             </table>
  233.  
  234.  
  235.                                             <table>
  236.                                                 <tr>
  237.                                                     <td style="width:250px;text-align:center">
  238.                                                         <span id="ContentPlaceHolder1_lastDay_W1_2">Humedad relativa (%)</span>
  239.                                                     </td>
  240.                                                     <td style="width:130px;text-align:center">
  241.                                                         <span id="ContentPlaceHolder1_lastDay_X1_2">93.3</span>
  242.                                                     </td>
  243.                                                     <td style="width:130px;text-align:center">
  244.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_2">78.2 (07:50)</span>
  245.                                                     </td>
  246.                                                     <td style="width:130px;text-align:center">
  247.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_2">96.5 (04:20)</span>
  248.                                                     </td>
  249.                                                 </tr>
  250.                                             </table>
  251.  
  252.  
  253.                                             <table>
  254.                                                 <tr>
  255.                                                     <td style="width:250px;text-align:center">
  256.                                                         <span id="ContentPlaceHolder1_lastDay_W1_3">Velocidad del Viento (m/s)</span>
  257.                                                     </td>
  258.                                                     <td style="width:130px;text-align:center">
  259.                                                         <span id="ContentPlaceHolder1_lastDay_X1_3">0.1</span>
  260.                                                     </td>
  261.                                                     <td style="width:130px;text-align:center">
  262.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_3">0.0 (00:00)</span>
  263.                                                     </td>
  264.                                                     <td style="width:130px;text-align:center">
  265.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_3">2.9 (08:00)</span>
  266.                                                     </td>
  267.                                                 </tr>
  268.                                             </table>
  269.  
  270.  
  271.                                             <table>
  272.                                                 <tr>
  273.                                                     <td style="width:250px;text-align:center">
  274.                                                         <span id="ContentPlaceHolder1_lastDay_W1_4">Dirección del Viento (°)</span>
  275.                                                     </td>
  276.                                                     <td style="width:130px;text-align:center">
  277.                                                         <span id="ContentPlaceHolder1_lastDay_X1_4">61.6 (ENE) </span>
  278.                                                     </td>
  279.                                                     <td style="width:130px;text-align:center">
  280.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_4"></span>
  281.                                                     </td>
  282.                                                     <td style="width:130px;text-align:center">
  283.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_4"></span>
  284.                                                     </td>
  285.                                                 </tr>
  286.                                             </table>
  287.  
  288.  
  289.                                             <table>
  290.                                                 <tr>
  291.                                                     <td style="width:250px;text-align:center">
  292.                                                         <span id="ContentPlaceHolder1_lastDay_W1_5">Presión atmosférica (hPa)</span>
  293.                                                     </td>
  294.                                                     <td style="width:130px;text-align:center">
  295.                                                         <span id="ContentPlaceHolder1_lastDay_X1_5">1011.4</span>
  296.                                                     </td>
  297.                                                     <td style="width:130px;text-align:center">
  298.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_5">1010.4 (04:10)</span>
  299.                                                     </td>
  300.                                                     <td style="width:130px;text-align:center">
  301.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_5">1013.2 (08:00)</span>
  302.                                                     </td>
  303.                                                 </tr>
  304.                                             </table>
  305.  
  306.  
  307.                                             <table>
  308.                                                 <tr>
  309.                                                     <td style="width:250px;text-align:center">
  310.                                                         <span id="ContentPlaceHolder1_lastDay_W1_6">Radiación Global (W/m²)</span>
  311.                                                     </td>
  312.                                                     <td style="width:130px;text-align:center">
  313.                                                         <span id="ContentPlaceHolder1_lastDay_X1_6">33.3</span>
  314.                                                     </td>
  315.                                                     <td style="width:130px;text-align:center">
  316.                                                         <span id="ContentPlaceHolder1_lastDay_Y1_6">-2.9 (00:00)</span>
  317.                                                     </td>
  318.                                                     <td style="width:130px;text-align:center">
  319.                                                         <span id="ContentPlaceHolder1_lastDay_Z1_6">355.9 (08:00)</span>
  320.                                                     </td>
  321.                                                 </tr>
  322.                                             </table>
  323.                                         </table>
  324.  
  325.  
  326.                                 </td>
  327.                             </tr>
  328.                         </table>
  329.                     </td>
  330.                 </tr>
  331.             </table>
  332.  
  333. </div>
  334.  
  335.                                             </div>
  336.                                         </div>
  337.                                     </div>
  338.                                 </div>
  339.                             </div>
  340.                         </div>
  341.                     </div>
  342.                 </div>
  343.             </div>
  344.         </div>
  345.         </div>
  346.  
  347.  
  348.  
  349. <script type="text/javascript">
  350. //<![CDATA[
  351. Sys.Application.add_init(function() {
  352.    $create(Sys.UI._Timer, {"enabled":true,"interval":20000,"uniqueID":"ctl00$ContentPlaceHolder1$Timer1"}, null, null, $get("ContentPlaceHolder1_Timer1"));
  353. });
  354. //]]>
  355. </script>
  356. </form>
  357. </body>
  358. </html>
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4
boligan
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2017-06-14 11:28 @519

Publicidad

Re: De HTML a TXT o XML

Notapor explorer » 2017-06-14 17:58 @790

Bueno, se puede hacer de muchas maneras. Una de ellas es analizando el código HTML línea a línea. Como parece que nos entregan la información de una manera más o menos ordenada, pues la leemos en ese orden.

Vamos a suponer que lo que queremos es capturar las líneas que coinciden con este patrón:

<span id="ContentPlaceHolder1_last.+?_(\w\d?)_(\d)">(.*?)</span>

O sea, un <span>...</span>, con un 'id' construido de una determinada manera. De ese patrón obtendremos unos datos, y guardaremos también el dato que el span rodea.

Luego, vamos a suponer también que ese 'id', termina de la forma siguiente, y en esta secuencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
W_0, X_0, Y_0, Z_0,
W_1, X_1, Y_1, Z_1,
...
W1_0, X1_0, Y1_0, Z1_0,
W1_1, X1_1, Y1_1, Z1_1,
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Para que estos índices sean todos uniformes, le pondremos un '0' a los primeros y ya queda todo un poco más normalizado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
W0_0, X0_0, Y0_0, Z0_0,
W0_1, X0_1, Y0_1, Z0_1,
...
W1_0, X1_0, Y1_0, Z1_0,
W1_1, X1_1, Y1_1, Z1_1,
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Además, vamos a suponer que SIEMPRE el dato que acompaña a 'W' corresponde al nombre de la variable, y que termina de forma opcional con un espacio en blanco, seguido de un par de paréntesis que rodea al nombre de la magnitud.

También, vamos a suponer que SIEMPRE el dato que acompaña a 'X', 'Y' y 'Z' corresponde a los valores promedio, mínimo y máximo, que pueden terminar, de forma opcional, con una marca de tiempo. Esa marca de tiempo es un espacio en blanco seguido de un par de paréntesis que rodea a un valor de horas y minutos (separados por un ':').

Entonces, suponiendo que las suposiciones supuestas antes, supuestamente se van a dar todas a la vez, el siguiente programa dará la solución pedida (es una suposición, claro).
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;                                              # versión mínima de Perl (vamos a usar 'say')
  3. use strict;                                             # vamos a programar de forma estricta
  4. use warnings;                                           # avísame de cualquier cosa rara que veas en el código
  5. use autodie;                                            # muérete en caso de error de entrada/salida
  6. use utf8;                                               # hay caracteres codificados en utf8, en este programa
  7. use open qw(:std :utf8);                                # las lecturas/escrituras desde/a archivos, siempre en utf8
  8.  
  9. ## Leer el HTML
  10. my %datos;                                              # aquí guardaremos lo que extraigamos del html
  11.  
  12. open my $html, '<', 'kk.html';                          # abrir el archivo
  13.  
  14. while (my $linea = <$html>) {                           # leer por líneas
  15.  
  16.     # saltamos a la siguiente línea, si la $linea no coincide con lo que estamos buscando
  17.     next if $linea !~ m{<span id="ContentPlaceHolder1_last.+?_(\w\d?)_(\d)">(.*?)</span>};
  18.  
  19.     # en caso de ser una línea interesante, hemos capturado la información que queremos extraer
  20.     my($letra, $indice, $valor) = ($1, $2, $3);
  21.  
  22.     if ($letra !~ /\d$/) {                              # caso excepcional: las letras W, X, Y y Z no tienen dígito después
  23.         $letra .= '0';                                  # pues se lo ponemos
  24.     }
  25.  
  26.     $datos{$letra}[$indice] = $valor;                   # guardamos lo encontrado en una matriz 3D
  27. }
  28.  
  29. close $html;                                            # cerrar
  30.  
  31. ## Sacar los datos
  32. #use Data::Dumper;                                      # para comprobar que es correcta la forma de leer y almacenar
  33.                                                         # los %datos
  34. #say Dumper \%datos;
  35.  
  36. my $contador = 0;                                       # empezamos por el subíndice 0
  37.  
  38. while (1) {                                             # bucle sin fin: no sabemos cuántas letras+número encontraremos
  39.  
  40.     my $var = 'W' . $contador;                          # creación del índice 'W0', 'W1', 'W2'... etc.
  41.  
  42.     last if not exists $datos{$var};                    # si no tenemos datos de ese índice,
  43.                                                         # suponemos que hemos terminado, y salimos
  44.  
  45.     my $num_vars = @{ $datos{$var} } - 1;               # cada índice 'Wx' tiene un cierto número de variables
  46.  
  47.     for (my $i = 1; $i <= $num_vars; $i++) {            # recorremos todos los valores, menos el primero, porque sabemos
  48.                                                         # que es un literal que no nos interesa (son los titulares, en la página)
  49.  
  50.         my %valores;                                    # vamos a leer los valores en un determinado orden
  51.         my @medidas = qw( Promedio Mínimo Máximo );   # éste
  52.  
  53.         my $variable;                                   # sacamos los valores desde %datos, siguiendo un orden exacto
  54.         ($variable, @valores{@medidas}) = (             # de las letras:
  55.             $datos{'W' . $contador}[$i],                        # nombre de la variable
  56.             $datos{'X' . $contador}[$i],                        # Promedio
  57.             $datos{'Y' . $contador}[$i],                        # Mínimo
  58.             $datos{'Z' . $contador}[$i],                        # Máximo
  59.         );
  60.  
  61.         # Detección de la magnitud
  62.         $variable =~ s/ \((.+?)\)$//;                   # vemos a ver si $variable contiene alguna magnitud
  63.         my $magnitud = $1 || '';                        # si es así, la quitamos y la guardamos aparte
  64.  
  65.         # Para cada medida
  66.         # Detección de la fecha dentro del valor
  67.         my %fechas;                                     # recorremos promedio, mínimo, máximo, mirando a ver si tienen
  68.         for my $med (@medidas) {                        # datos de fechas (realmente, solo horas:minutos)
  69.             $fechas{$med} = '';                         # valor por defecto
  70.  
  71.             if ($valores{$med} =~ s/ \((\d\d:\d\d)\)$//) {      # en caso de que tenga hora
  72.                 $fechas{$med} = $1;                             # la guardamos
  73.             }
  74.  
  75.             # salida del resultado (sí: no hay que hacer nada más)
  76.             say qq(<Data Variable="$variable" Unit="$magnitud" Value="$valores{$med}" DateTime="$fechas{$med}" Type="$med" />);
  77.  
  78.         }
  79.     }
  80. }
  81. continue {
  82.     $contador++;                                        # repetimos el bucle indefinidamente
  83. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
La salida es esta (para el html ofrecido antes):
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <Data Variable="Temperatura del aire" Unit="°C" Value="27.4" DateTime="" Type="Promedio" />
  2. <Data Variable="Temperatura del aire" Unit="°C" Value="27.1" DateTime="" Type="Mínimo" />
  3. <Data Variable="Temperatura del aire" Unit="°C" Value="27.8" DateTime="" Type="Máximo" />
  4. <Data Variable="Humedad relativa" Unit="%" Value="81.5" DateTime="" Type="Promedio" />
  5. <Data Variable="Humedad relativa" Unit="%" Value="78.2" DateTime="" Type="Mínimo" />
  6. <Data Variable="Humedad relativa" Unit="%" Value="84.2" DateTime="" Type="Máximo" />
  7. <Data Variable="Velocidad del Viento" Unit="m/s" Value="1.3" DateTime="" Type="Promedio" />
  8. <Data Variable="Velocidad del Viento" Unit="m/s" Value="0.3" DateTime="" Type="Mínimo" />
  9. <Data Variable="Velocidad del Viento" Unit="m/s" Value="2.3" DateTime="" Type="Máximo" />
  10. <Data Variable="Dirección del Viento" Unit="°" Value="93.7 (E) " DateTime="" Type="Promedio" />
  11. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Mínimo" />
  12. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Máximo" />
  13. <Data Variable="Presión atmosférica" Unit="hPa" Value="1012.7" DateTime="" Type="Promedio" />
  14. <Data Variable="Presión atmosférica" Unit="hPa" Value="1012.6" DateTime="" Type="Mínimo" />
  15. <Data Variable="Presión atmosférica" Unit="hPa" Value="1013.0" DateTime="" Type="Máximo" />
  16. <Data Variable="Radiación Global" Unit="W/m²" Value="297.5" DateTime="" Type="Promedio" />
  17. <Data Variable="Radiación Global" Unit="W/m²" Value="277.4" DateTime="" Type="Mínimo" />
  18. <Data Variable="Radiación Global" Unit="W/m²" Value="314.5" DateTime="" Type="Máximo" />
  19. <Data Variable="Temperatura del aire" Unit="°C" Value="23.4" DateTime="" Type="Promedio" />
  20. <Data Variable="Temperatura del aire" Unit="°C" Value="22.2" DateTime="04:50" Type="Mínimo" />
  21. <Data Variable="Temperatura del aire" Unit="°C" Value="28.0" DateTime="08:00" Type="Máximo" />
  22. <Data Variable="Humedad relativa" Unit="%" Value="93.3" DateTime="" Type="Promedio" />
  23. <Data Variable="Humedad relativa" Unit="%" Value="78.2" DateTime="07:50" Type="Mínimo" />
  24. <Data Variable="Humedad relativa" Unit="%" Value="96.5" DateTime="04:20" Type="Máximo" />
  25. <Data Variable="Velocidad del Viento" Unit="m/s" Value="0.1" DateTime="" Type="Promedio" />
  26. <Data Variable="Velocidad del Viento" Unit="m/s" Value="0.0" DateTime="00:00" Type="Mínimo" />
  27. <Data Variable="Velocidad del Viento" Unit="m/s" Value="2.9" DateTime="08:00" Type="Máximo" />
  28. <Data Variable="Dirección del Viento" Unit="°" Value="61.6 (ENE) " DateTime="" Type="Promedio" />
  29. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Mínimo" />
  30. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Máximo" />
  31. <Data Variable="Presión atmosférica" Unit="hPa" Value="1011.4" DateTime="" Type="Promedio" />
  32. <Data Variable="Presión atmosférica" Unit="hPa" Value="1010.4" DateTime="04:10" Type="Mínimo" />
  33. <Data Variable="Presión atmosférica" Unit="hPa" Value="1013.2" DateTime="08:00" Type="Máximo" />
  34. <Data Variable="Radiación Global" Unit="W/m²" Value="33.3" DateTime="" Type="Promedio" />
  35. <Data Variable="Radiación Global" Unit="W/m²" Value="-2.9" DateTime="00:00" Type="Mínimo" />
  36. <Data Variable="Radiación Global" Unit="W/m²" Value="355.9" DateTime="08:00" Type="Máximo" />
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: De HTML a TXT o XML

Notapor boligan » 2017-06-19 10:03 @460

Bueno, muchas gracias, realmente quedó genial. Saca todo lo que necesito. Muchísimas gracias y felicidades por el día de ayer si eres padre.

Como ya te dije soy nuevo en esto de Perl y la salida que me da este script estoy tratando de que en vez de mostrarla en pantalla me la escriba directamente en un xml que será leído por JavaScript. No logro obtener esta salida, además las tildes me dan problemas, lo cual es la codificación utf8, pero no logro arreglarlo. Si puedes ayudarme de nuevo, muchas gracias.

<Data Variable="Temperatura del aire" Unit="┬░C" Value="26.8" DateTime="" Type="Promedio" />
<Data Variable="Temperatura del aire" Unit="┬░C" Value="26.6" DateTime="" Type="MÝnimo" />
<Data Variable="Temperatura del aire" Unit="┬░C" Value="26.9" DateTime="" Type="Mßximo" />
<Data Variable="Humedad relativa" Unit="%" Value="85.6" DateTime="" Type="Promedio" />
<Data Variable="Humedad relativa" Unit="%" Value="85.0" DateTime="" Type="MÝnimo" />
<Data Variable="Humedad relativa" Unit="%" Value="86.5" DateTime="" Type="Mßximo" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="4.5" DateTime="" Type="Promedio" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="1.6" DateTime="" Type="MÝnimo" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="7.9" DateTime="" Type="Mßximo" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="112.7 (ESE) " DateTime="" Type="Promedio" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="" DateTime="" Type="MÝnimo" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="" DateTime="" Type="Mßximo" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1007.3" DateTime="" Type="Promedio" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1007.2" DateTime="" Type="MÝnimo" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1007.5" DateTime="" Type="Mßximo" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="90.0" DateTime="" Type="Promedio" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="74.7" DateTime="" Type="MÝnimo" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="101.2" DateTime="" Type="Mßximo" />
<Data Variable="Temperatura del aire" Unit="┬░C" Value="24.9" DateTime="" Type="Promedio" />
<Data Variable="Temperatura del aire" Unit="┬░C" Value="23.2" DateTime="03:00" Type="MÝnimo" />
<Data Variable="Temperatura del aire" Unit="┬░C" Value="26.9" DateTime="09:40" Type="Mßximo" />
<Data Variable="Humedad relativa" Unit="%" Value="90.8" DateTime="" Type="Promedio" />
<Data Variable="Humedad relativa" Unit="%" Value="82.7" DateTime="07:40" Type="MÝnimo" />
<Data Variable="Humedad relativa" Unit="%" Value="97.7" DateTime="03:20" Type="Mßximo" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="4.3" DateTime="" Type="Promedio" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="0.6" DateTime="01:00" Type="MÝnimo" />
<Data Variable="Velocidad del Viento" Unit="m/s" Value="16.1" DateTime="04:20" Type="Mßximo" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="128.9 (SE) " DateTime="" Type="Promedio" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="" DateTime="" Type="MÝnimo" />
<Data Variable="Direcci├│n del Viento" Unit="┬░" Value="" DateTime="" Type="Mßximo" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1006.0" DateTime="" Type="Promedio" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1004.8" DateTime="03:50" Type="MÝnimo" />
<Data Variable="Presi├│n atmosf├®rica" Unit="hPa" Value="1007.5" DateTime="09:10" Type="Mßximo" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="10.3" DateTime="" Type="Promedio" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="-0.9" DateTime="05:00" Type="MÝnimo" />
<Data Variable="Radiaci├│n Global" Unit="W/m┬▓" Value="101.2" DateTime="09:40" Type="Mßximo" />
boligan
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2017-06-14 11:28 @519

Re: De HTML a TXT o XML

Notapor explorer » 2017-06-19 11:57 @539

Para grabar el resultado, se pueden poner un par de líneas open() ... close() y modificar la línea del say() para que saque la salida a un archivo externo, pero también hay otra forma: capturar esa salida desde el entorno de la línea de comandos:

perl programa.pl > salida.xml

El tema de las tildes es por la codificación, cierto.

Un archivo xml, mientras no lo diga en su cabecera, se supone siempre que está codificado en UTF-8. Por eso, en la línea 7 informamos a Perl que queremos que las entradas y salidas hacia/desde todos los archivos, incluidos los estándares (entrada, salida y salida de errores estándares) deben ir en esa codificación.

Si lo estás viendo mal, no quiere decir que la salida está mal, sino que, muy posiblemente, tu terminal no está trabajando en UTF-8.

Prueba a realizar la redirección a salida.xml como te he indicado antes, y luego abres ese archivo con un editor que entienda la codificación UTF-8, y verás que todo sale bien.

Cosa distinta es que quieras que el resultado salga en una codificación completamente distinta. Por ejemplo, si queremos sacarlo en iso-8859-1, necesitaremos poner

binmode(STDOUT, ":encoding(ISO-8859-1)");

unas líneas antes de empezar a trabajar, por ejemplo, antes de la línea 10.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: De HTML a TXT o XML

Notapor boligan » 2017-06-19 12:32 @564

Bueno, acabo de verificar lo que me dices de:

perl programa.pl > salida.xml

Queda perfecto.

Lo de las tildes no he sabido resolver pues no logro agregar

<?xml version="1.0" encoding="utf-8"?>

en la cabecera del xml y el Notepad me da bateo con las tildes.

Respecto a la opción que me das "Para grabar el resultado, se pueden poner un par de líneas open() ... close() y modificar la línea del say() para que saque la salida a un archivo externo", esto es lo que me gustaría hacer para que me quede más compacto el código, pero no lo he logrado... no sé cómo modificar el say y asignar:

<Data Variable="$variable" Unit="$magnitud" Value="$valores{$med}" DateTime="$fechas{$med}" Type="$med" />

a salida.xml.

Bueno, si puedes... gracias.

Hola otra vez.

Jugando un poco con el código estoy probando a ver si alcanzo a sacar los datos de solo una de las dos tablas y mirando esto que me pones: "Vamos a suponer que lo que queremos es capturar las líneas que coinciden con este patrón:
<span id="ContentPlaceHolder1_last.+?_(\w\d?)_(\d)">(.*?)</span>"

Trato de variar este patrón por el de:

"<span id="ContentPlaceHolder1_lastDay.+?_(\w\d?)_(\d)">(.*?)</span>"

Con esto le estoy pidiendo solo la segunda tabla que es la que tiene ese patrón, "lastDay". Sin embargo no me funciona, o sea, no saca ningún dato aunque no da error.

¿Cómo hago para sacar solo la segunda tabla?

Gracias.
boligan
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2017-06-14 11:28 @519

Re: De HTML a TXT o XML

Notapor explorer » 2017-06-20 20:17 @887

boligan escribiste:Lo de las tildes no he sabido resolver pues no logro agregar

<?xml version="1.0" encoding="utf-8"?>

en la cabecera del xml y el Notepad me da bateo con las tildes.
Pero, hombre... le pides a Notepad que edite el salida.xml y pones esa línea al principio. Eso sí... todas las líneas <Data> deben estar dentro de un elemento raíz, para que sea un xml conforme a las reglas XML. Por ejemplo, sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<?xml version="1.0" encoding="utf-8"?>
<Datas>
        <Data ...
        <Data ...
        <Data ...
</Datas>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Pues eso, es cuestión de agregar un par de marcas más. Esto lo puedes hacer a mano, o en el mismo programa.

boligan escribiste:Respecto a la opción que me das "Para grabar el resultado, se pueden poner un par de líneas open() ... close() y modificar la línea del say() para que saque la salida a un archivo externo", esto es lo que me gustaría hacer para que me quede más compacto el código, pero no lo he logrado... no sé cómo modificar el say y asignar:

<Data Variable="$variable" Unit="$magnitud" Value="$valores{$med}" DateTime="$fechas{$med}" Type="$med" />

a salida.xml.
Debes poner un open al principio del programa, que abra el archivo "salida.xml" en modo escritura. Algo así:

open my $FH, '>', 'salida.xml';

por ejemplo, en la línea 37.

Luego, modificar el say indicando el identificador de archivo que queremos que use:

say $FH qq(<Data ...

Y, finalmente, un close $FH; en la línea 84.

boligan escribiste:Jugando un poco con el código estoy probando a ver si alcanzo a sacar los datos de solo una de las dos tablas y mirando esto que me pones: "Vamos a suponer que lo que queremos es capturar las líneas que coinciden con este patrón:
<span id="ContentPlaceHolder1_last.+?_(\w\d?)_(\d)">(.*?)</span>"

Trato de variar este patrón por el de:

"<span id="ContentPlaceHolder1_lastDay.+?_(\w\d?)_(\d)">(.*?)</span>"

Con esto le estoy pidiendo solo la segunda tabla que es la que tiene ese patrón, "lastDay". Sin embargo no me funciona, o sea, no saca ningún dato aunque no da error.

¿Cómo hago para sacar solo la segunda tabla?
Quita el '.+?' que sigue a 'lastDay'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: De HTML a TXT o XML

Notapor boligan » 2017-06-22 15:35 @691

Hola.

Bueno, he probado lo que me aconsejas. Aquí está el resultado:
  1. mejorar la salida xml para que ponga las tildes... Me dices que agregue <?xml version="1.0" encoding="utf-8"?> y que "todas las líneas <Data> deben estar dentro de un elemento raíz, para que sea un xml conforme a las reglas XML", bueno esto es lo que me da de resultado:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using xml Syntax Highlighting
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Pinar-SantaLucia-EMA>
    3. <Data Variable="Temperatura del aire" Unit="°C" Value="32.7" DateTime="" Type="Promedio" />
    4. <Data Variable="Temperatura del aire" Unit="°C" Value="32.5" DateTime="" Type="Mmo" />
    5. <Data Variable="Temperatura del aire" Unit="°C" Value="33.0" DateTime="" Type="M⹩mo" />
    6. <Data Variable="Humedad relativa" Unit="%" Value="55.6" DateTime="" Type="Promedio" />
    7. <Data Variable="Humedad relativa" Unit="%" Value="54.1" DateTime="" Type="Mmo" />
    8. <Data Variable="Humedad relativa" Unit="%" Value="57.8" DateTime="" Type="M⹩mo" />
    9. <Data Variable="Velocidad del Viento" Unit="m/s" Value="5.0" DateTime="" Type="Promedio" />
    10. <Data Variable="Velocidad del Viento" Unit="m/s" Value="2.3" DateTime="" Type="Mmo" />
    11. <Data Variable="Velocidad del Viento" Unit="m/s" Value="10.8" DateTime="" Type="M⹩mo" />
    12. <Data Variable="Dirección del Viento" Unit="°" Value="132.2 (SE) " DateTime="" Type="Promedio" />
    13. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Mmo" />
    14. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="M⹩mo" />
    15. <Data Variable="Presión atmosférica" Unit="hPa" Value="1011.0" DateTime="" Type="Promedio" />
    16. <Data Variable="Presión atmosférica" Unit="hPa" Value="1010.9" DateTime="" Type="Mmo" />
    17. <Data Variable="Presión atmosférica" Unit="hPa" Value="1011.2" DateTime="" Type="M⹩mo" />
    18. <Data Variable="Radiación Global" Unit="W/m²" Value="838.7" DateTime="" Type="Promedio" />
    19. <Data Variable="Radiación Global" Unit="W/m²" Value="213.4" DateTime="" Type="Mmo" />
    20. <Data Variable="Radiación Global" Unit="W/m²" Value="923.4" DateTime="" Type="M⹩mo" />
    21. <Data Variable="Temperatura del aire" Unit="°C" Value="28.1" DateTime="" Type="Promedio" />
    22. <Data Variable="Temperatura del aire" Unit="°C" Value="23.8" DateTime="06:00" Type="Mmo" />
    23. <Data Variable="Temperatura del aire" Unit="°C" Value="33.1" DateTime="13:30" Type="M⹩mo" />
    24. <Data Variable="Humedad relativa" Unit="%" Value="77.3" DateTime="" Type="Promedio" />
    25. <Data Variable="Humedad relativa" Unit="%" Value="52.0" DateTime="13:30" Type="Mmo" />
    26. <Data Variable="Humedad relativa" Unit="%" Value="96.2" DateTime="06:10" Type="M⹩mo" />
    27. <Data Variable="Velocidad del Viento" Unit="m/s" Value="2.6" DateTime="" Type="Promedio" />
    28. <Data Variable="Velocidad del Viento" Unit="m/s" Value="0.0" DateTime="00:10" Type="Mmo" />
    29. <Data Variable="Velocidad del Viento" Unit="m/s" Value="14.3" DateTime="11:50" Type="M⹩mo" />
    30. <Data Variable="Dirección del Viento" Unit="°" Value="106.4 (ESE) " DateTime="" Type="Promedio" />
    31. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="Mmo" />
    32. <Data Variable="Dirección del Viento" Unit="°" Value="" DateTime="" Type="M⹩mo" />
    33. <Data Variable="Presión atmosférica" Unit="hPa" Value="1011.9" DateTime="" Type="Promedio" />
    34. <Data Variable="Presión atmosférica" Unit="hPa" Value="1010.9" DateTime="15:00" Type="Mmo" />
    35. <Data Variable="Presión atmosférica" Unit="hPa" Value="1013.0" DateTime="00:10" Type="M⹩mo" />
    36. <Data Variable="Radiación Global" Unit="W/m²" Value="336.4" DateTime="" Type="Promedio" />
    37. <Data Variable="Radiación Global" Unit="W/m²" Value="-3.8" DateTime="01:30" Type="Mmo" />
    38. <Data Variable="Radiación Global" Unit="W/m²" Value="1100.8" DateTime="13:40" Type="M⹩mo" />
    39. </Pinar-SantaLucia-EMA>
    Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

    Ya esto lo tenía hecho y no me resolvía. Como ves quedan las tildes de Mínimo y Máximo sin salir...
  2. la parte de la salida.xml: "poner un open al principio del programa, que abra el archivo "salida.xml" en modo escritura. Ya esta hecho. De maravilla.
  3. variar el patrón para obtener solo una de las dos tablas. Me dices que haga "Quita el '.+?' que sigue a 'lastDay'.". Bueno, resulta que lo he hecho de mil maneras y no logro que me encuentre el patrón. Por ejemplo, hago
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using text Syntax Highlighting
    <span id="ContentPlaceHolder1_lastDay_(\w\d?)_(\d)">(.*?)</span>
    <span id="ContentPlaceHolder1_lastD.+?_(\w\d?)_(\d)">(.*?)</span>
    <span id="ContentPlaceHolder1_la.+?_(\w\d?)_(\d)">(.*?)</span>
    <span id="ContentPlaceHolder1_lastDa.+?_(\w\d?)_(\d)">(.*?)</span>
    Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

    Ninguno de estos funciona.
    Ya me he leído varios tutoriales sobre expresiones regulares pero no logro dar con lo que sucede. Por favor, disculpa tanta molestia pero es que estoy comenzando con esto de Perl.
Gracias.
boligan
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2017-06-14 11:28 @519

Re: De HTML a TXT o XML

Notapor explorer » 2017-06-22 17:57 @789

  1. El tema de las tildes de Máximo y Mínimo. Resulta que esas palabras no se sacan de la página web, sino que las escribe el propio programa (están en la línea 51). Eso me da la pista de que no has escrito el programa en formato utf8, como le estás diciendo a Perl en la línea 6. Por favor: si estás usando un editor de textos para editar el programa, asegúrate que está guardando el resultado en utf8. O si no, comenta la línea 6, y guárdalo en formato latin1 o iso-8859-1
  2. Ok
  3. El problema no está en el patrón. Es correcto usar el primero que has puesto (quitar .+? después de lastDay). El problema es otro: de los datos de partida. Resulta que en la página html, en las líneas correspondientes a lastDay, no hay combinaciones del tipo '_W_', '_X_', etc. Es decir, las entradas lastDay siempre tienen un índice acompañando a las letras. Por esa razón el programa no crea ninguna entrada 'W0', y por eso el programa se termina al salir por la línea 42. La solución es cambiar el '0' por un '1' en la línea 36.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: De HTML a TXT o XML

Notapor boligan » 2017-06-23 13:49 @618

Bueno, ya todo lo implementé y está trabajando al 100 %. Muchas gracias por las aclaraciones. Saludos.
boligan
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2017-06-14 11:28 @519


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron