Corrigir matriz de links incompletos

4

Estou escrevendo um script que encontrará links em uma página. Ele faz o download do código-fonte de uma página e encontra links em tags a e os armazena em uma matriz, $ links. O problema é que alguns links não incluem o URL inteiro, apenas a subpágina ou o arquivo. Diga que o código-fonte de uma página é assim:

<h1>Julian's crappy webpage</h1>
<a href="http://one.com">Page One</a>
<a href="https://two.com">Page Two</a>
<a href="/three">Page Three</a>
<a href="four">Page Four</a>

Depois de encontrar links, a matriz seria algo como isto:

http://one.com
https://two.com
/three
four

Eu também tenho uma variável $ URL que é um URL válido, por exemplo " link "

Eu preciso de uma maneira de validar todos os itens em $ links fazendo coisas diferentes com base no item. Para cada item em links $ :

  • Se o item começar com a /, combine: $ URL + $ {links [n]}
  • Se o item não começar com "/" ou "https: //" ou "http: //", combine: $ URL + < strong> "/" + $ {links [n]}

Resposta esperada, por exemplo, acima:

http://one.com
https://two.com
https://google.com/three
https://google.com/four
    
por Julian Lachniet 28.05.2016 / 22:02

2 respostas

4

Aqui está um exemplo de script que você pode usar para implementar isso:

#!/bin/bash

shopt -s extglob
readonly URL="https://google.com"
links=($(grep -o -P '(?<=href=").*(?=")' source.html)) # read into array

for ((i=0; i<${#links[@]}; i++))
do
  case ${links[$i]} in
    http*)
      : # do nothing
      ;;
    /*)  
      links[$i]="$URL"${links[$i]}; # update array
      ;; 
    *)
      links[$i]="$URL/"${links[$i]}; # update array
      ;;
  esac
done

Ele assume que source.html é a fonte baixada da página da web no diretório atual.

    
por 28.05.2016 / 23:00
0

Existem inúmeras maneiras de usar um regex para analisar HTML que pode dar errado . Mesmo para uma tarefa aparentemente simples, como a extração de URLs de um arquivo HTML.

Então, não use um regex. Use algo assim:

#! /bin/bash

htmlfile='./file.html'
URL='https://google.com'

links=($(lynx -dump -listonly -nonumbers -force_html "$htmlfile" | 
         sed -e "s=^file://=$URL="))

printf "%s\n" "${links[@]}"

Isso requer que o lynx esteja instalado. lynx é um navegador da Web em modo de texto baseado em ncurses. Ele está sendo usado aqui apenas para gerar uma lista de links no arquivo HTML, porque lynx já resolveu o problema muito mais difícil do que você imagina de como encontrar URLs com segurança em conteúdo HTML (isso é uma parte importante do trabalho de um navegador). Outras linguagens como perl ou python possuem bons módulos de biblioteca para analisar HTML para extrair URLs. Para scripts de shell, use lynx .

Veja man lynx para detalhes.

lynx é quase certamente disponível pré-empacotado para sua distribuição Linux ou outro sistema operacional similar a unix. Se não, você pode obter o código-fonte do link acima.

    
por 29.05.2016 / 12:15