Batch - Obter o URL de um arquivo do documento html

0

Eu quero usar o curl para baixar a versão mais recente do este arquivo . O site tem um robots.txt, no entanto, que é o que eu acho que está me impedindo de usar apenas curl -L -z WorldGuard.zip http://www.curse.com/server-mods/minecraft/worldguard/download para obtê-lo. Existe um link direto http://addons.curse.cursecdn.com/files/684/741/worldguard-5.7.3.zip para o arquivo que está localizado no código-fonte HTML da página e eu posso usar este link para encurvá-lo, já que este link não é um permalink, eu preciso encontrar uma maneira de obter esse url a partir do primeiro link (que é um link permanente).

Se eu usar curl -L http://www.curse.com/server-mods/minecraft/worldguard/download , termino com este como saída. Eu tentei usar FOR /F "skip=628 tokens=10,11,12,13,14 delims=/ " %%a in ('curl -L http://www.curse.com/server-mods/minecraft/worldguard/download') DO curl -z foo.zip %%a') mas parece haver um limite para quantas linhas posso pular (similar ao limite de token de 31) e provavelmente teria me dado todas as linhas depois disso também (não o que eu quer).

Em seguida, tentei salvar a saída em um arquivo de texto e excluir todas as linhas, exceto a que eu quero, no entanto, não sei como excluir linhas que não contêm uma string específica. Eu estava pensando em focar apenas as linhas que tinham "http://addons.curse.cursecdn.com/files/" (em outras palavras, a linha que tinha o URL que eu queria), mas não tenho ideia de como fazer isso.

Como posso obter apenas o url (ou a parte que muda: 684/741/worldguard-5.7.3.zip ) e, portanto, posso fazer o download?

Editar: estou aberto a alternativas se não houver uma maneira fácil de fazer isso em um script em lote e / ou usando o curl. Estou disposto a aceitar respostas que usem visual basic (.vbs.), Powershell ou qualquer coisa que possa ser executada a partir de um arquivo de lote (que deve ser quase tudo). Eu ainda prefiro usar o lote e curl para mantê-lo consistente e em um arquivo, e porque eu já tenho 90% do que eu quero em lote. Além disso, não estou familiarizado com as coisas que não são em lote, por isso prefiro que você explique o que o script faz.

    
por Craft1n3ss 28.04.2013 / 07:58

3 respostas

0

Os comandos a seguir procurarão a linha contendo o link de download no arquivo .htm e usarão um método rápido e sujo de extrair o URL dessa linha. Não é muito robusto, mas deve funcionar desde que o html usado para a linha "Se o seu download não começar clique aqui" não seja alterado drasticamente.

for /F "tokens=4 delims==" %i in ('findstr download-link source.htm') do 
    @set match=%i
set zipurl=%match:~1,-7%
echo %zipurl%|findstr /R ^http://.*\.zip$

O atributo 'class="download-link"' expõe a tag que está vinculada ao arquivo .zip. Usando o sinal de igual como um delimitador, o próximo token seria "http://addons.[...].zip" class . Para eliminar as cotações circunvizinhas e a palavra 'class', uma substring de %match% é armazenada em %zipurl% . A terceira linha é um tanto opcional, mas pode ser usada para verificar se o script ainda funciona. Findstr define %errorlevel% para zero se o URL extraído foi iniciado com 'http: //' e terminado em '.zip' e o define como um caso contrário.

Para uso em um arquivo de lote, substitua %i por %%i .

    
por 28.04.2013 / 13:44
0

...however, I don't know how to delete lines that don't contain a specific string...

Para excluir linhas que NÃO contêm uma string específica, consulte esta postagem Expressão regular para corresponder à string que não contém uma palavra

Há mais informações na postagem e várias outras respostas são fornecidas, mas o básico dessa resposta é:

Você pode usar uma combinação de sed e grep (ou sed e find ) para filtrar as linhas do arquivo.

  1. Pesquise / substitua o arquivo inteiro para adicionar uma "Tag" exclusiva ao início de cada linha que contenha qualquer texto.
  2. Para todas as linhas que contêm a sequência de destino , remova a "Tag" exclusiva do início da linha.
  3. Neste ponto, todas as linhas que começam com a "Tag" exclusiva, NÃO contêm o destino string. Agora você pode delete (ou fazer "outra coisa") apenas para essas linhas.
por 28.04.2013 / 08:30
0

Você pode fazer isso em algumas etapas a menos usando sed e grep , mas aqui está uma solução usando somente comandos incorporados.

@echo off

rem    edit next line to include your filename    
set "zzfilename=captured-page.html"

rem    get the target line
type "%zzfilename%"|find /i "data-href"|find /i ".zip">"zztarget.txt"
for /f "usebackq delims=" %%f in ('type "zztarget.txt"') do set zzaaa=%%f

rem    change double-quotes to single-quotes
set "zzaaa1=%zzaaa:"='%"

rem    remove unneeded text from the beginning of the line
set "zzaaa2=%zzaaa1:*data-href=gotit%"

rem    remove the "<" and ">" characters
set "zzaaa3=%zzaaa2:<='%"
set "zzaaa4=%zzaaa3:>='%"

rem    from what remains, take only the desired URL
for /f "usebackq tokens=2 delims='" %%f in ('echo %zzaaa4%') do set "zzgotit=%%f"

rem    show the work and cleanup
set zz
set "zzaaa="
set "zzaaa1="
set "zzaaa2="
set "zzaaa3="
set "zzaaa4="
del "zztarget.txt">nul 2>&1

O URL completo estará na variável zzgotit .

    
por 28.04.2013 / 20:05