Como faço para baixar um conjunto de arquivos de acordo com um padrão?

0

Veja o que estou tentando fazer:

  1. Fazer o download de uma página da Web
  2. Encontre todas as strings correspondentes a uma expressão regular
  3. Pré-adicione e acrescente constantes de string a eles para formar URLs totalmente qualificados
  4. Download de todos eles

Isso deve ser fácil! Um monte de curl e grep ligados com cachimbos deve ser suficiente, mas não consigo!

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Além disso, o grep parece não reconhecer [^\"] .

Coisas como o DownThemAll! não são flexíveis o suficiente.

    
por Ansis Māliņš 26.07.2012 / 12:30

3 respostas

1

Eu desisti do grep. Espero que uma solução perl seja OK.

curl http://example.com/?q=blah | perl -e ' @alt=map { /alt="(.*?)"/ig } ; print "$_\n" foreach(@alt)'

dada esta entrada:

afk alt="<I want to find this>" easdfg alt="<I want to find that>" 
adsfsgw wt er ger 
ekfj er  alt="<I want to find this other>" alt="<I want to find this anotherthing>" fgerg
ey 
 ty rth
<img src="file.gif">

retorna isso:

<I want to find this>
<I want to find that>
<I want to find this other>
<I want to find this anotherthing>
    
por 26.07.2012 / 13:46
0

Eu noto que aspas duplas são usadas ao redor do lote, então eu acho que é feito em cmd.exe (embora muitos usuários linux usem o grep, há a versão do windows. Eu agradeço qualquer correção para mim sobre isso, mas seu exemplo parece-me como se fosse para a implementação do windows, em virtude do uso de aspas duplas, eu também estou usando uma implementação windows do grep - a do gnuwin32 (ao contrário do cygwin, por exemplo).

Antes de tudo, gostaria de corrigir o erro na linha que você usou com o grep (não chamarei isso de erro na sua regex, já que isso é um problema cmd.

Aqui estava o seu exemplo com o seu regex com grep que não estava funcionando.

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Como você diz, [^\"] não está funcionando

Vamos ver exatamente o que está sendo passado para o grep pelo cmd (o que o grep está analisando)

Isso exigirá um programa em C, o programa em C está incluído nesta pergunta sobre uma citação que não está funcionando Obtendo esta expressão regular simples para combinar com o grep

Vou colar o código do programa em C aqui.

Você pode usar este programa para ver o que o grep ou qualquer programa do Windows recebe. (Eu posso estar errado em alguma tecnicalidade aqui e saúdo uma correção se for assim). Dito isso, isso funciona.

Aqui está o programa que usaremos para determinar o que está acontecendo

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i = 0;
    while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
    }
    return 0;
}

Eu compilei isso. w.c, para w.exe

Aqui está um exemplo simples do que está acontecendo ..

Aqui está um exemplo que funciona

W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]

W:\>

Você vê acima que nosso programa (w) recebe 2 parâmetros, o primeiro é o nome do programa (w), o segundo é [^"]

Agora aqui está um exemplo bem menor que tem a mesma falha do seu, o [^\"] não está funcionando

W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]

W:\>

Veja o que o grep está recebendo. Eu não sei por que .. Mas parece que quando isso "está antes do [^ \"] e há aspas duplas em torno da coisa toda, então o [^ \ "] não funciona, vemos exatamente o resultado , o [^ \ "] sai como ["] Estamos perdendo o nosso caret ^

Isso preservará o nosso cursor, como podemos ver no programa.

W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]

W:\>

Além do problema do Windows, há um problema com o seu regex que você provavelmente deseja ter uma visão antecipada de uma cotação, para que você não corresponda à cotação final. Você justamente incluiu o lookbehind para não coincidir com a cotação inicial.

Como exemplo

W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test

Suponha que tenhamos esse arquivo chamado a.a

dsfsdf dfdsf  alt="here" dddd

rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"

Agora aplicamos

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Então, o regex funciona e no grep.

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Agora vamos supor que eu poderia produzir isso para um arquivo. a.b então a.b agora contém essas 3 linhas. (você sempre pode copiar / colar em a.b)

Agora a.b tem

here
there
df

vamos usar sed para adicionar um pouco antes e depois

W:\>sed -r "s#(.*)#http://blah.com/.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>

E poderíamos baixar todos aqueles com wget

W:\>sed -r "s#(.*)#http://blah.com/.htm#" a.b >a.c

W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm

W:\>wget -i a.c
--2012-07-26 23:21:06--  http://blah.com/here.htm
Resolving blah.com... ^C
W:\>
    
por 27.07.2012 / 00:21
0

Verificação de wget -r -A.pdf [url] para padrões simples. Isto irá baixar todo o pdf de uma [url] recursivamente. Este fragmento do documento é útil.

‘-A acclist --accept acclist’ ‘-R rejlist --reject rejlist’ Specify comma-separated lists of file name suffixes or patterns to accept or reject (see Types of Files). Note that if any of the wildcard characters, ‘*’, ‘?’, ‘[’ or ‘]’, appear in an element of acclist or rejlist, it will be treated as a pattern, rather than a suffix.

    
por 20.05.2013 / 12:52