60 votes

Meilleure façon d'extraire les URL d'une page HTML en utilisant sed ou awk uniquement

Je veux extraire l'URL à partir des balises d'ancrage d'un fichier html. Cela doit être fait dans BASH avec SED / AWK. Pas de perl s'il vous plait.

Quelle est la manière la plus simple de faire ça?

56voto

Hardy Points 6274

Vous pouvez également faire quelque chose comme ceci (à condition que vous ayez installé Lynx):

 lynx -dump -listonly my.html
 

38voto

Greg Bacon Points 50449

Vous l'avez demandé:

 $ wget -O - http://stackoverflow.com | \
  grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
  sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//'
 

Il s’agit d’un outil grossier. Tous les avertissements habituels concernant l’essai d’analyser HTML avec des expressions régulières s’appliquent.

14voto

Ingo Karkat Points 61399

Avec l' outil d'extraction de données Xidel - HTML / XML , vous pouvez le faire via:

 $ xidel --extract "//a/@href" http://example.com/
 

Avec conversion en URL absolues:

 $ xidel --extract "//a/concat(resolve-uri(@href, base-uri()))" http://example.com/
 

14voto

kerkael Points 51
grep "<a href=" sourcepage.html
  |sed "s/<a href/\\n<a href/g" 
  |sed 's/\"/\"><\/a>\n/2'
  |grep href
  |sort |uniq
  1. La première grep cherche les lignes contenant des url. Vous pouvez ajouter plus d'éléments après si vous voulez voir uniquement sur les pages, donc pas de http, mais chemin d'accès relatif.
  2. Le premier sed va ajouter un saut de ligne en face de chaque a href balise d'url avec le \n
  3. La deuxième sed va raccourcir chaque url après le 2ème " dans la ligne en la remplaçant par la /une balise avec un saut de ligne Les deux sed va vous donner chaque url sur une seule ligne, mais il est des ordures, de sorte
  4. La 2ème grep href nettoie le désordre
  5. Le tri et uniq vais vous donner un exemple de chacun des url présentes dans le sourcepage.html

12voto

ghostdog74 Points 86060

Un exemple, puisque vous n'avez fourni aucun échantillon

 awk 'BEGIN{
RS="</a>"
IGNORECASE=1
}
{
  for(o=1;o<=NF;o++){
    if ( $o ~ /href/){
      gsub(/.*href=\042/,"",$o)
      gsub(/\042.*/,"",$o)
      print $(o)
    }
  }
}' index.html
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X