Tentando usar a URL do html no arquivo .txt usando sed

1

Eu pude usar o código abaixo para fazer o grep de listas de urls da fonte html antes, mas por alguma razão não está funcionando para este exemplo específico.

grep:

grep -1 box-download shareit1.txt|sed 's/<a/\/n/'|sed 's/href/\/n/'|grep http|cut -d\" -f2>> shareit2.txt

url:

<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl"
        data-ua="#c,#l,a=Download,downloadType=HostedDownload"
    >
    <strong>Free Download
        <span>Safe download</span>
    </strong>
    <i class="icon-download-alt"></i>
</a>

Aprecie a ajuda.

    
por Lewandajo 08.10.2015 / 19:30

5 respostas

0
sed 's/^[^"]*  *//
     s/" */"\n/2
      /\n/P;D
'    <in >out

Isso vai se revezar na impressão e comendo linhas de entrada, um contexto de duaspas por vez. Ele provavelmente tornará seus dados muito mais grep friendly. Como está escrito, não funciona se os contextos citados puderem abranger novas linhas, mas, pelo que entendi, eles não deveriam estar em HTML.

De qualquer forma, torna sua amostra muito mais fácil de manusear:

class="box-download"
data-no-file="0"
title="SHAREit free download"
href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe"
id="download-button"
class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
class="icon-download-alt"
    
por 08.10.2015 / 20:17
1

Com este (fixo) arquivo.html:

<html>
  <div class="box-download">
    <a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl" data-ua="#c,#l,a=Download,downloadType=HostedDownload">
      <strong>Free Download<span>Safe download</span></strong>
      <i class="icon-download-alt"></i>
    </a>
  </div>
</html>

Comando:

xmlstarlet sel -t -v "//html/div/a/@href" file.html

Saída:

http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe
    
por 08.10.2015 / 20:10
0

Não funciona, porque você tem as barras invertidas (a menos que o analisador do StackExchange especifique as coisas). Você descobriu que, para selecionar o conteúdo do atributo, você o colocará em uma nova linha e cortará a partir daí. Mas o caractere de nova linha é \n , não \/n . O segundo é " /n , garantindo que a barra seja tratada literalmente".

Então, esse código, após a correção, funcionará:

grep -1 box-download shareit1.txt|sed 's:<a:\n:'|sed 's/href/\n/'|grep http |cut -d\" -f 2

Embora você possa reduzir o número de canais e invocações de programas externos confiando somente em sed :

sed -n -e '/http/ s:.*href="\([^"]*\)".*:: p' shareit1.txt

Por outro lado, todas essas abordagens estão erradas de qualquer maneira. A maneira correta é usar o DOM / XPath. O problema é que não há nenhum analisador de DOM para o shell (que eu saiba) e analisadores XML de shell comuns que permitem especificar expressões XPath esperam que o arquivo seja XML válido - o conteúdo do site quase nunca é. Em outras linguagens de programação, como Python, Ruby ou Perl (para mencionar as mais comuns para administradores de sistema), existem bibliotecas que transformam o arquivo HTML confuso em algo que se parece com um arquivo XML válido e que pode ser inserido no analisador XML. p>     

por 08.10.2015 / 20:02
0

Você pode usar lynx -dump --list-only para extrair uma lista de URLs da entrada html.

Se você ainda não tem o lynx instalado, você terá que instalá-lo usando qualquer mecanismo que seja normal para o seu sistema linux ou unix (por exemplo, apt-get , yum , make install , etc)

por exemplo,

$ lynx -force_html -dump --listonly shareit1.txt | awk '/^ *[0-9]+\. / { print $2}'
http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe
    
por 09.10.2015 / 01:14
0

Você pode usar o filhote ; é uma ferramenta incrível.

Veja como eu faço o download de um arquivo e adiciono links específicos de dentro do HTML para um arquivo.

wget http://domain.com -O file.html && pup 'a.className[href] attr{href}' < file.html > links.md

Todos os links em Domain.com com o nome de classe className serão baixados e salvos em um arquivo chamado links.md .

    
por 05.08.2016 / 18:58

Tags