Extraia o link completo de um elemento div

1

Estou baixando episódios de uma série, mas estou cansado de me inscrever no site, copiando o link e baixando-o para cada episódio.

Primeiro, eu participo do site e recebo o código HTML. O código é grande, mas estou interessado nisso em particular (é onde o link é)

    var e=Array(),d=1;e[1]='<div style="margin-left:7px"><object width="720" height="450" class="BLOG_video_class" id="BLOG_video-ee57f234e359092e" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="movie" value="//www.youtube.com/get_player"><param name="bgcolor" value="#FFFFFF"><param name="allowfullscreen" value="true"><param name="flashvars" value="flvurl=http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da87eff0521883521%26offsetms%3D5000%26itag%3Dw160%26sigh%3DaUKIa9j5GROOBShBybzlFhMGllc&amp;autoplay=0"><embed src="//www.youtube.com/get_player" type="application/x-shockwave-flash"width="720" height="450" bgcolor="#FFFFFF"flashvars="flvurl=http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da87eff0521883521%26offsetms%3D5000%26itag%3Dw160%26sigh%3DaUKIa9j5GROOBShBybzlFhMGllc&autoplay=0"allowFullScreen="true" /></object></div>';e[2]='<div style="margin-left:7px"><iframe src="http://videosasd.com/play-zs-www30.zippyshare.com/v/94301695/file.html" width="720" height="450" scrolling="no" frameborder="0"></iframe></div>';

Bem, é um código muuuuito, mas estou interessado em conseguir isso. (Existem 2 links idênticos, ambos funcionam sem o '& amp; amp' no final)

    http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&amp

Agora, eu estou usando esta regEX (Note que estou noob com isso, eu testo e funciona)

\s*flvurl\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+));*%26key%3Dck2&amp

E, no terminal eu uso

wget -q -O - "serverlink" | sed -e "s/\s*flvurl\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+));*%26key%3Dck2&amp//g"

Eu recebo um erro com unexpected token ) ''

Alguém sabe como posso consertar isso? (Ou, talvez, alguém conheça um regex melhor para obter o link da primeira caixa de código)

    
por lucas_7_94 05.05.2014 / 14:22

2 respostas

1

Aqui estão algumas abordagens mais simples para conseguir o que você quer:

  1. grep com PCREs

    wget -q -O - "serverlink" | grep -oP 'flvurl=\K[^;]+(?=&amp;)' 
    

    Explicação

    Nos PCREs, o \K significa "descartar tudo combinado até aqui" . A opção -o para grep significa "imprimir apenas a parte correspondente de uma string" . Portanto, grep -oP 'flvurl=\K significa: "procure flvurl= e comece a corresponder após ." A [^;]+ significa "corresponde a muitos não ; caracteres possíveis .

    O formato foo(?=bar) é chamado de lookahead positivo . Não faz parte da cadeia de correspondência real. Isso significa _ "corresponder foo seguido por bar mas descartar bar . Juntando tudo isso, a expressão regular acima exibirá tudo entre flvurl= e &amp; .

  2. sed

    wget -q -O - "serverlink" | sed -nr 's/.*flvurl=([^;]+)&amp;.*//p' 
    

    Explicação

    O operador de substituição (eu uso o tradicional s/// em vez do s\\ que você usou, mas é a mesma ideia), substituirá tudo com o texto entre flvurl= e &amp; . Os parênteses estão lá para "capturar" a string correspondente, disponibilizando-a como . A opção -r ativa expressões regulares estendidas que podem lidar com parênteses sem precisar escapar ( \( e \) ) deles. Essa é a razão pela qual você estava recebendo o erro pelo caminho.

    O -n suprime a saída normal, nenhuma linha será impressa por padrão. O p no final da substituição ( s///p ) significa "imprimir a linha atual se a substituição foi bem sucedida" .

  3. Perl

    Usando a mesma lógica que o sed acima:

    wget -q -O - "serverlink" | perl -ne 's/.*flvurl=([^;]+)&amp;.*// && print' 
    
por terdon 05.05.2014 / 15:15
0

Sua linha de comando é canalizar a saída de wget para sed - para substituir o resultado do comando sed como um argumento de URL na linha de comando do wget, precisará fazer algo como

wget -q -O- -- $(echo -n "urlstring" | sed -e 's/pattern/replacement/')

ou

wget -q -O- -- $(sed -e 's/pattern/replacement/' <<< "urlstring")

O -e pode ser omitido neste contexto.

    
por steeldriver 05.05.2014 / 15:24