Precisa de ajuda para extrair informações de vários arquivos html [req: batch / c ++ / notepad script]

0

Eu tenho mais de 100 arquivos dos quais preciso extrair algumas informações e copiá-las para arquivos separados. Eles são todos arquivos html e possuem codificação html. Formato de arquivo:

<html>
<head>
...
... useless text ..
</head>
<body>
.. useless text ..
<div class="container">
<div class="another container">
<div class="heading_container">

important text 
<table> ... important table contents </table>
important text
</div> //.../heading 
</div> //garbage div close..
</div>/// etc etc closing divs..
<div class="clear"></div> 
//above line is in all the files... so maybe the script could be written to copy all until this div (?) .
</div>

</body>
</html>

Eu preciso copiar todo o texto em <div class="heading_container"> ...

Alguma ideia de como eu poderia fazer isso em um script em lote? Ou algum software html para fazer isso em um software de lote?

Eu não sei muito sobre scripts em lote, mas talvez o script possa conter um loop for / while para copiar texto para um arquivo:

variable string_start = '<div class="heading_container">';
variable string_end = '<div class="clear">';
get file("FILE_URL");
READ the file until 'string_start' is reached.
output from 'string start' onwards, to a different folder with same filename.
stop output once string_end is reached.
stop read from the file.

Isso poderia ser feito? Eu não sou muito bom na sintaxe de algoritmos também!

    
por mk117 29.12.2013 / 19:29

3 respostas

1

Se o seu conteúdo tiver <div> , seu script / código precisará ser inteligente o suficiente para identificar o fechamento correspondente </div> .
Eu encontrei uma solução baseada em PHP que pode fazer isso. Encontre aqui: PHP HTML DOM Parser ( link )

Você pode usar isso em combinação com directoryiterator e file_put_contents para gravar arquivos com conteúdo em um loop.
Se você quiser inserir isso em um modelo HTML, poderá salvar seu modelo HTML com algum texto discernível no lugar do conteúdo real que deseja colocar assim:

<div class="new_data">
replace_me_discernible_text_not_appearing_anywhere_else_in_file
</div>

Depois, você pode substituir este texto pelo seu conteúdo. Aqui está um script completo para fazer isso (o crédito parcial do Script vai para o OP. Eu estou colando aqui para referência futura ):

<?php
include('simple_html_dom.php');

$destdir = "extracted_html";
$oldMessage = "replace_me_discernible_text_not_appearing_anywhere_else_in_file";
$dir = new DirectoryIterator("content_html");
foreach ($dir as $fileinfo)
        {
    if (!$fileinfo->isDot())
                {
                $file_name = basename($fileinfo);
                $html = file_get_html("content_html/$file_name");
                foreach($html->find('div.heading') as $e)
                        {

                        $str=file_get_contents('template.html');
                        $str=str_replace($oldMessage, $e,$str);
                        file_put_contents("$destdir/$file_name", $str);
                        echo $file_name . " <b>Done!</b> </br>";
                        }
                }
        }
?>

Espero que isso funcione.

    
por 31.12.2013 / 18:44
1

Isso é feito facilmente com a porta Windows do PCREGREP e o seguinte comando:

for %%i in (*.html) do (
  pcregrep -N CRLF -M -o "<div class="""heading_container""">(.+?)</div>" "%%i" ^
  > "%%~ni.cpp"
)

Se você tiver div s extra no meio, poderá usar essa linha no loop for para extrair até a limpeza div :

  …
  pcregrep -N CRLF -M -o "<div class="""heading_container""">(.+?)<div class="""clear""">" "%%i" ^
  …

Figura 1 : resultados do teste

    
por 30.12.2013 / 03:53
0

Ok, esta é uma versão simples do que você

#!/bin/sh 
for X in $(find ./ -name "*.html")
    do
    FN=$(echo $X | cut -d '/' -f 3)
    cat $X | awk '/^< div class=\"heading_container\" >/,/< div class=\"clear\"><\/div >/  { print }' > ./new/$FN   
    done 

Se todos os seus arquivos estiverem no sub-diretório chamado old em um diretório chamado files. Execute isso a partir do diretório files, ele irá remover as informações desejadas e colocá-las no mesmo nome de arquivo no diretório ./files/new.

Isso é bastante hacky e não funcionará se houver subdiretórios antigos.

Eu posso dar uma olhada no aprimoramento disso e atualizarei se eu puder fazer melhor.

UPDATE

Apesar de eu ter sido informado sobre o alvo para isso, o windows aqui é um script mais completo que pode ajudar alguém no futuro.

#!/bin/sh

cd old

# Create the directory structure in the 'new' directory 

for Z in $(find ./ -type d)
        do
        Z=$(echo $Z | tr -d '.')
        mkdir ../new/$Z
        done
cd ..
# Find all relevent files snip the interesting bit and copy to the same file in ../new 

for X in $(find ./ -name "*.html")
        do
        FN=$(echo $X | cut -d '/' -f 3-100)
        cat $X | awk '/^< div class=\"heading_container\" >/,/< div class=\"clear\"><\/div >/  { print }' > ./new/$FN
        done

A principal ressalva é remover (fazer backup e remover) o diretório "novo" antes de executá-lo.

    
por 29.12.2013 / 20:51