Esta es una forma de hacerlo. Si suponemos que la estructura de los datos es siempre la misma (consistente), entonces podemos construir una serie de reglas de patrones de expresiones regulares con los que podemos identificar cada registro de Empresa, y los campos que contiene, y luego sacarlos a la salida.
Si partimos de este archivo de ejemplo:
Using html4strict Syntax Highlighting
<div class="Empresa">
<div class="Nombre">Nombre1 Prueba</div>
<div class="Telefono">Telefono1 Prueba</div>
<div class="Telefono">Telefono1 Prueba Dos</div>
<div class="Direccion">Direccion1 Prueba</div>
<div class="Pais">Pais1 Prueba</div>
<div style="width:492px; float:left;"> <br>
</div>
<div style="clear: both"></div>
</div>
<div class="Empresa">
<div class="Nombre">Nombre2 Prueba</div>
<div class="Telefono">Telefono2 Prueba</div>
<div class="Telefono">Telefono2 Prueba Dos</div>
<div class="Direccion">Direccion2 Prueba</div>
<div class="Pais">Pais2 Prueba</div>
<div style="width:492px; float:left;"> <br>
</div>
<div style="clear: both"></div>
</div>
<div class="Empresa">
<div class="Nombre">Nombre3 Prueba</div>
<div class="Telefono">Telefono3 Prueba</div>
<div class="Telefono">Telefono3 Prueba Dos</div>
<div class="Direccion">Direccion3 Prueba</div>
<div class="Pais">Pais3 Prueba</div>
<div style="width:492px; float:left;"> <br>
</div>
<div style="clear: both"></div>
</div>
<div class="Empresa">
<div class="Nombre">Nombre4 Prueba</div>
<div class="Telefono">Telefono4 Prueba</div>
<div class="Telefono">Telefono4 Prueba Dos</div>
<div class="Direccion">Direccion4 Prueba</div>
<div class="Pais">Pais4 Prueba</div>
<div style="width:492px; float:left;"> <br>
</div>
<div style="clear: both"></div>
</div>
<div class="Empresa">
<div class="Nombre">Nombre5 Prueba</div>
<div class="Telefono">Telefono5 Prueba</div>
<div class="Telefono">Telefono5 Prueba Dos</div>
<div class="Direccion">Direccion5 Prueba</div>
<div class="Pais">Pais5 Prueba</div>
<div style="width:492px; float:left;"> <br>
</div>
<div style="clear: both"></div>
</div>
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Entonces, con este programa
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
use autodie;
use File::Slurp;
my $archivo_html = read_file('code_36794.html');
## Definición de las reglas
my $nombre = qr{<div class="Nombre">(?<nombre>.+?)</div>\s*};
my $telefono = qr{<div class="Telefono">(?<telefono>.+?)</div>\s*};
my $direccion = qr{<div class="Direccion">(?<direccion>.+?)</div>\s*};
my $pais = qr{<div class="Pais">(?<pais>.+?)</div>\s*};
my $empresa = qr{<div class="Empresa">\s*$nombre(?<telefonos>$telefono+)$direccion$pais};
## Proceso
while ($archivo_html =~ /$empresa/gs) {
# encontrada una empresa. Sacamos los campos encontrados
my($nombre, $telefonos, $direccion, $pais) = @+{ qw( nombre telefonos direccion pais ) };
my @telefonos = $telefonos =~ /$telefono/g; # extracción de los teléfonos
# salida del registro
say $nombre;
say for @telefonos;
say $direccion;
say $pais;
say '=' x 50;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
el resultado es
Using text Syntax Highlighting
Nombre1 Prueba
Telefono1 Prueba
Telefono1 Prueba Dos
Direccion1 Prueba
Pais1 Prueba
==================================================
Nombre2 Prueba
Telefono2 Prueba
Telefono2 Prueba Dos
Direccion2 Prueba
Pais2 Prueba
==================================================
Nombre3 Prueba
Telefono3 Prueba
Telefono3 Prueba Dos
Direccion3 Prueba
Pais3 Prueba
==================================================
Nombre4 Prueba
Telefono4 Prueba
Telefono4 Prueba Dos
Direccion4 Prueba
Pais4 Prueba
==================================================
Nombre5 Prueba
Telefono5 Prueba
Telefono5 Prueba Dos
Direccion5 Prueba
Pais5 Prueba
==================================================
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Usamos la marca de Empresa como inicio del registro, del que deben colgar todos los demás, y en exactamente ese orden. La único raro es el teléfono, que puede ser más de uno. Los capturamos todos de golpe, que más tarde, sacaremos uno a uno para meterlo en un
array. Finalmente, lo sacamos todo, en el orden pedido.