J'essaie d'utiliser grep et cut pour extraire les URL d'un fichier HTML. Les liens ressemblent à:
<a href="http://examplewebsite.com/">
D'autres sites Web l'ont fait .net
, .gov
mais je suppose que je pourrais faire le point juste avant >
. Je sais donc que je peux utiliser grep et cut d'une manière ou d'une autre pour tout couper avant http et après .com, mais je suis coincé dessus depuis un moment.
shell-script
grep
string
cut
eltigre
la source
la source
<>
force à être considéré comme une balise HTML.Réponses:
Comme je l'ai dit dans mon commentaire, ce n'est généralement pas une bonne idée d'analyser le HTML avec des expressions régulières, mais vous pouvez parfois vous en tirer si le HTML que vous analysez se comporte bien.
Afin d'obtenir uniquement les URL qui se trouvent dans l'
href
attribut des<a>
éléments, je trouve qu'il est plus facile de le faire en plusieurs étapes. D'après vos commentaires, il semble que vous ne souhaitiez que le domaine de premier niveau, pas l'URL complète. Dans ce cas, vous pouvez utiliser quelque chose comme ceci:où
source.html
est le fichier contenant le code HTML à analyser.Ce code imprimera toutes les URL de niveau supérieur qui apparaissent comme l'
href
attribut de tous les<a>
éléments de chaque ligne. L'-i
option de la premièregrep
commande est de faire en sorte que cela fonctionnera sur les deux<a>
et<A>
éléments. Je suppose que vous pourriez aussi donner-i
au 2egrep
pour capturer lesHREF
attributs majuscules , OTOH, je préférerais ignorer un tel HTML cassé. :)Pour traiter le contenu de
http://google.com/
production
Ma sortie est un peu différente des autres exemples car je suis redirigé vers la page Google australienne.
la source
://
nous n'acceptons que les caractères avant le premier/
ou"
. Mais si vous voulez voir l'URL complète, changez cette commande engrep -Eo '(http|https)://[^"]+
. Une autre option pour cette ligne est degrep -Eo '(http|https)://[^?"]+'
couper les options de requête. Cependant, cette variante imprimera toujours les URL contenues dans une autre URL en tant que paramètre de requête, mais elles seront imprimées sur une ligne distincte.Je ne sais pas si vous êtes limité sur les outils:
Mais l'expression régulière n'est peut-être pas la meilleure façon de procéder, comme mentionné, mais voici un exemple que j'ai rassemblé:
Production:
Vous pouvez également ajouter
\d
pour attraper d'autres types de chiffres.la source
sort -u
?Si votre grep prend en charge les expressions rationnelles Perl:
(?<=href=")
et(?=")
sont des expressions de contournement pour l'href
attribut. Cela nécessite l'-P
option.-o
imprime le texte correspondant.Par exemple:
Comme d'habitude, rien ne garantit que ce sont des URI valides ou que le code HTML que vous analysez sera valide.
la source
Comme alternative non regex , utilisez pup :
Trouvera tous les
a
éléments qui ont unhref
attribut, puis affichera la valeur duhref
attribut.Pour installer
pup
, vous avez besoin de Go (un langage de programmation):L'avantage de cette solution est qu'elle ne dépend pas du formatage correct du HTML .
la source
pup
, il est temps d'installer cela ....pup 'a.classname[href] attr{href}' < tut.html >links.md
J'ai trouvé une solution ici qui est à humble avis beaucoup plus simple et potentiellement plus rapide que ce qui a été proposé ici. J'ai ajusté un peu pour prendre en charge les fichiers https. Mais la version TD; TR est ...
PS: Vous pouvez remplacer l'URL du site par un chemin d'accès à un fichier et cela fonctionnera de la même manière.
Si vous souhaitez simplement voir les liens au lieu de les placer dans un fichier, essayez plutôt ceci ...
Le résultat ressemblera à ce qui suit ...
Pour mon cas d'utilisation, cela a très bien fonctionné. Mais attention, de nos jours, les gens ajoutent des liens comme src = "// blah.tld" pour l'URI CDN des bibliothèques. Je ne voulais pas les voir dans les liens récupérés.
Pas besoin d'essayer de vérifier les liens href ou autres sources car "lynx -dump" extraira par défaut tous les liens cliquables d'une page donnée. Donc, la seule chose que vous devez faire après cela est d'analyser le résultat de "lynx -dump" en utilisant grep pour obtenir une version brute plus propre du même résultat.
la source
... ferait probablement très bien. Tel qu'écrit, il imprime:
S'il est important de ne faire correspondre que des liens et parmi ces domaines de premier niveau, vous pouvez faire:
... ou quelque chose comme ça - bien que pour certains
sed
s vous devrez peut-être substituer un caractère littéral\n
ewline pour chacun des deux derniersn
s.Comme écrit, la commande ci-dessus imprime:
... et dans les deux cas (mais probablement le plus utilement avec ce dernier), vous pouvez virer
|sort -u
au bout d' un filtre pour obtenir la listesort
et supprimer les doublons.la source
Le plus court
la source
la source