Comment obtenir le contenu d'une page Web dans une variable shell?

115

Sous Linux, comment puis-je récupérer une URL et obtenir son contenu dans une variable dans un script shell?

Aillyn
la source

Réponses:

189

Vous pouvez utiliser la wgetcommande pour télécharger la page et la lire dans une variable comme:

content=$(wget google.com -q -O -)
echo $content

Nous utilisons l' -Ooption wgetdont nous permet de spécifier le nom du fichier dans lequel wgetvide le contenu de la page. Nous spécifions -d'obtenir le vidage sur la sortie standard et de le collecter dans la variable content. Vous pouvez ajouter l' -qoption silencieuse pour désactiver la sortie wget.

Vous pouvez utiliser la commande curl pour cela ainsi que:

content=$(curl -L google.com)
echo $content

Nous devons utiliser l' -Loption car la page que nous demandons peut avoir été déplacée. Dans ce cas, nous devons récupérer la page à partir du nouvel emplacement. L' option -Lou --locationnous aide avec cela.

codaddict
la source
C'est un truc vraiment sympa. J'invoque un script shell via un script php sur un serveur proxy. Lorsqu'on lui a demandé, le serveur proxy allume des serveurs coûteux qui s'éteignent après 2 heures. J'ai besoin de la sortie de wget pour que la sortie standard soit renvoyée à l'enregistrement de la console Jenkins.
Dennis
Je n'ai pas encore compris cela ... Quelqu'un peut-il démontrer comment, par exemple. obtenir une balise img dans une variable pour ce lien www2.watchop.io/manga2/read/one-piece/1/4 ??
juggernauthk108
@ juggernaut1996: cela devrait être une question distincte. En bref, vous devez télécharger la page, extraire l' srcattribut de l'élément correct, puis télécharger cette page. Si vous installez tq , cette commande devrait le faire:curl -s http://ww1.watchop.io/manga2/read/one-piece/1/4 | tq -j -a src "#imgholder a img" | xargs wget
pyrocrastie
La version 1.14 de Wget n'accepte pas convert_links = onavec l' -O-option. Il échoue avec erreur -k can be used together with -O only if outputting to a regular file.. Est-ce attendu?
Prasad Bonthu
28

Il existe de nombreuses façons d'obtenir une page à partir de la ligne de commande ... mais cela dépend aussi si vous voulez la source du code ou la page elle-même:

Si vous avez besoin de la source du code:

avec curl:

curl $url

avec wget:

wget -O - $url

mais si vous voulez obtenir ce que vous pouvez voir avec un navigateur, lynx peut être utile:

lynx -dump $url

Je pense que vous pouvez trouver tellement de solutions à ce petit problème, vous devriez peut-être lire toutes les pages de manuel pour ces commandes. Et n'oubliez pas de remplacer $urlpar votre URL :)

Bonne chance :)

julianvdb
la source
3
content=`wget -O - $url`
Jim Lewis
la source
@rjack: (Mais l'article auquel vous avez lié fait un très bon cas pour la syntaxe $ (...).)
Jim Lewis
3

Si LWP est installé, il fournit un binaire nommé simplement " GET ".

$ GET http://example.com
<! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // EN">
<HTML>
<HEAD>
  <META http-equiv = "Content-Type" content = "text / html; charset = utf-8">
  <TITLE> Exemple de page Web </TITLE>
</HEAD> 
<body>  
<p> Vous avez accédé à cette page Web en tapant & quot; exemple.com & quot ;,
& quot; example.net & quot;, & quot; example.org & quot
  ou & quot; exemple.edu & quot; dans votre navigateur Web. </p>
<p> Ces noms de domaine sont réservés pour une utilisation dans la documentation et ne sont pas disponibles 
  pour l'enregistrement. Voir <a href="http://www.rfc-editor.org/rfc/rfc2606.txt"> RFC
  2606 </a>, section 3. </p>
</BODY>
</HTML>

wget -O-, curlet lynx -sourcese comportent de la même manière.

éphémère
la source
2

Vous pouvez utiliser curlou wgetpour récupérer les données brutes, ou vous pouvez utiliser w3m -dumppour avoir une belle représentation textuelle d'une page Web.

$ foo=$(w3m -dump http://www.example.com/); echo $foo
You have reached this web page by typing "example.com", "example.net","example.org" or "example.edu" into your web browser. These domain names are reserved for use in documentation and are not available for registration. See RFC 2606, Section 3.
Giacomo
la source