Analisar vários HTML para texto e renomear como diretório pai

3

Em um diretório existem muitas pastas .html dentro, eu gostaria que todo HTML fosse analisado como novo .txt com o nome do diretório pai.

Exemplo1 / Index.html > Example1.txt

Exemplo2 / Index.html > Example2.txt

    
por z4nb0t 09.05.2013 / 08:45

1 resposta

2

Obviamente, você deseja converter algumas páginas HTML em texto simples. Portanto, eu não desnudaria as tags com uma solução personalizada (por exemplo, com alguma mágica sed), mas usaria uma ferramenta projetada para essa finalidade, como html2text ; da sua página da Web:

html2text is a Python script that converts a page of HTML into clean, easy-to-read plain ASCII text. Better yet, that ASCII also happens to be valid Markdown (a text-to-HTML format).

Para resolver sua questão de renomeação em lote:

find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dirname
 do python path/to/html2text/html2text.py "${dirname}/index.html" > "${dirname}/${dirname}.txt"
done

Aqui, o comando find lista todos os diretórios localizados apenas no diretório atual (ou seja, não recursivo) e o comando read (na condição while) atribui os valores à variável $dirname . Finalmente, o (s) comando (s) entre do e done get (s) executado, aqui ele converte os arquivos de acordo com o seu pedido. Como apontado por @slhck, você precisa usar um comando tão complexo, para que nomes de usuário com espaços em branco não quebrem nada.

[Editar] : outra variante para converter todos os arquivos HTML no diretório atual:

find . -iname "*.html" -print0 | while IFS= read -r -d '' filename
  do python path/to/html2text/html2text.py "${filename}" > "${filename%.*}.txt"
done

iname pesquisas caso i nsensitive para *.html .

${filename%.*}.txt retira a extensão e anexa .txt , ou seja, se filename for some/path/index.html , ${filename%.*} for some/path/index e finalmente ${filename%.*}.txt for some/path/index.txt .

Quando você usa o Z shell , você pode usar um loop muito mais limpo, sem frear em espaços em branco:

for i (*(/)) python path/to/html2text/html2text.py "${i}/index.html" > "${i}/${i}.txt"

O truque aqui é que *(/) gera o nome do arquivo, mas apenas retorna os diretórios (/) .

[Editar] : Também na sintaxe zsh a variante para converter todos os arquivos HTML no diretório atual (você precisa da opção EXTENDEDGLOB a ser definida):

for i ((#i)**/*.html) {
   python path/to/html2text/html2text.py "$i" > "${i:r}.txt"
}

(#i) usa o caso i globalização nsensitiva, ** procura recursivamente, portanto, retorna todos os arquivos HTML no diretório de trabalho atual. (Se os links simbólicos devem ser seguidos, use três estrelas *** em vez de dois).

Se você tiver mais de um comando dentro do loop for, use parênteses { ... } (desnecessário aqui, mas eles não vão doer).

${i:r} retira a extensão (r para remoção) da variável $i .

    
por 09.05.2013 / 09:33