tentando extrair duas tabelas de cada vez de arquivos http com 40 tabelas cada

0

Eu tenho cerca de 20 páginas da web. Cada página tem navegação de banner superior e, em seguida, tem informações sobre até 20 veículos. Existem 2 mesas por veículo.
O fluxo lógico é: navegação de página, tabela 1 para o veículo 1, tabela 2 para o veículo 1, tabela 1 para o veículo 2, tabela 2, para o veículo 2, ... fim da página.
Exemplo de tabelas incluídas abaixo.

Eu quero obter as informações das páginas html e em um banco de dados.
O plano: separe os dados de cada veículo individual em arquivos individuais & depois analise / extraia os dados dos arquivos.

Eu não entendo o awk, então estou usando o sed.

Plano de extração: encontre a linha w / "car_photo", volte 4 linhas (que será a tag da tabela), extraia dessa linha até a segunda tag / table. Repita até o último conjunto de tabelas.

Procurei online exemplos de como obter sed para extrair de um determinado número de linha até a próxima instância de uma expressão regular ... ela continua sendo extraída até a instância final. & mesmo que funcionasse, quero extrair até a segunda instância.

Aqui está uma amostra de um arquivo, com os dados substituídos com mais informações genéricas.

32321 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:
32322 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:
32321 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:
32323 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:
32324 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:
32325 Faço: Modelo: Ano de Ano:
VIN:
Cor:
Ano de aquisição:
Quilometragem: Última mudança de óleo: Seguro devido: O registro expira:

Eu tentei criar um loop que seria executado 20 vezes.     Cada vez, o sed extrairia as linhas 1 através da linha com </table>     Em seguida, o sed é executado novamente para excluir essas linhas.     Em seguida, ele extrai as linhas 1 até a próxima linha com </table> novamente (para obter a segunda tabela)      sed , em seguida, exclui a segunda tabela.

Each time 'sed' extracts a table, it concatenates to a new file using the loop counter.

O problema é que sed não está parando na primeira ocorrência de </table> . Está parando na ÚLTIMA ocorrência.

    
por Mike 20.07.2013 / 11:43

1 resposta

0

Se eu estivesse fazendo isso com frequência, estaria usando a análise XPath por meio de algo como a gema Nokogiri para Ruby.

No entanto, aqui está algo que poderia funcionar, mas sem um script bash para combiná-los exigirá algumas etapas por arquivo (acho que são 20 no seu caso).

Passo 1: Converta o html linha por linha, tanto quanto possível, para que o awk possa processá-lo.

Começando com a entrada html do seu comentário em car.html , eu fiz

cat car.html | awk -F"> " '{ for( i = 1; i <= NF; i++ ) printf( "%s>\n", $i ) } ' > new.html

que me deu um arquivo new.html como

<table>
<tr><td width="90">
<div class="car_photo">
<div class="space">
<img src="../photos/veh5.jpeg">
</div>
</div>
</div>
</td>
<td align="right" class="car_details" width="400">
<table>
<tr>
<td class="line_bottom" width="190">
<div class="text_left">32325</a>
</div>
</td>
</tr>
</table>
<div class="line_bottom">
Make: </div>
<div class="line_bottom">Model: <br>Year: <br />
</div>
</td>
<td class="car_details" width="400">
<div class="line_bottom">Mileage:</div>
<div class="line_bottom">Oil Change: </div>
<div class="line_bottom">Registration:</div>
<br>
</td>
</tr>
</table>

Passo 2: Pegue o arquivo e coloque-o em um script awk que eu coloquei em seu próprio arquivo chamado awko

#!/usr/bin/awk -f

BEGIN { FS=">" }

$1 ~ /<table/ { table_cnt++ }

$1 ~ /<\/table/ { table_cnt-- }

table_cnt > 0 {
    for( i = 1; i <= NF; i++ ) {
        split( $i, arr, "<" )
        if( length( arr[ i ] ) > 0 )
            printf( "%s\n", arr[ 1 ] )
    }

}

executando isso como

awko new.html 

me deu um resultado como:

32325
Make: 
Model: 
Mileage:
Oil Change: 
Registration:

A saída no awko pode ser modificada para criar uma saída com estilo CSV, para facilitar a importação para um banco de dados. E novamente, essas etapas diferentes poderiam ser combinadas em um script de shell para o "levantamento de nome de arquivo pesado" em um loop apropriado, mas eu não tenho tempo para isso agora.

awko está essencialmente procurando o que é o texto de cada linha com o início / fim que você especificou.

Opa. Eu só notei que esta pergunta é antiga. Oh, bem, cometer essa resposta de qualquer maneira.

    
por 21.08.2013 / 06:39