obtendo links incluindo html externo

0

De uma página html com muitos links, estou procurando uma maneira de extrair apenas os links que seguem um formato específico.

<a href="https://always/same/link/same-name_19.html">always same text</a>
<a href="https://always/same/link/same-name_18.html">always same text</a>
<a href="https://always/same/link/same-name_17.html">always same text</a>

Encontrei muitas soluções usando grep , sed e outras, mas todas elas retornam os links internos sem as tags html e a parte "always same text".

Ele deve funcionar a partir do script linha de comando / bash, estou usando o Debian Jessie. a solução não precisa ser um oneliner.

atualizar

o script que fiz com a ajuda da resposta de Ryan.

Curl=https://always/same/link/
filename=same-name

page='curl "$Curl$filename"'
echo $page > $filename.curl

Gurl=https://always/same/link/

# working
link='grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' $filename.curl | sort | tail -n1' 

# not working; $link will be empty
link='grep -Eo "<a href=\"https://always/same/link/same-name_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1' 

# not working; $link will be empty
link='grep -Eo "<a href=\"${Gurl}${filename}_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1' 

# what i ended up using.
link='grep -Eo '<a href="'${Gurl}${filename}'_([0-9]+)\.html\">always same text</a>' $filename.curl | sort | tail -n1' 
echo $link | grep -o 'https:.*[.]html'
    
por Ricky 26.04.2016 / 22:12

1 resposta

1

Assumindo que a maior parte do atributo href é sempre a mesma, e o texto interno é sempre o mesmo, e você tem um arquivo de origem HTML, então algo assim deve funcionar:

grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' HTML-source-file

grep pesquisará o HTML-source-file do padrão https://always/same/link/same-name_([0-9]+)\.html . Esse padrão corresponderá a qualquer string composta dos seguintes elementos, em ordem:

  1. link
  2. qualquer número de dígitos de 0 a 9
  3. .html

O -E sinalizador diz grep para interpretar o padrão como uma expressão regular estendida.

O -o sinalizador diz grep para produzir apenas o texto que corresponde ao padrão.

Para usar variáveis, você pode usar aspas duplas em torno da expressão regular, escapar as aspas duplas dentro da expressão regular com barras invertidas e colocar os nomes das variáveis entre chaves:

$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo "<a href=\"${link_path}${link_name}_([0-9]+)\.html\">always same text</a>" HTML-source-file

Se, por alguma razão, o acima de grep com aspas duplas vazadas não funcionar, você também pode usar isto:

$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo '<a href="'${link_path}${link_name}'_([0-9]+)\.html">always same text</a>' HTML-source-file
    
por 26.04.2016 / 22:48