wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
Vous pouvez le diriger vers GNU recode
s’il contient des éléments tels <
que:
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' |
recode html..
Pour enlever la - youtube
pièce:
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)(?: - youtube)?\s*<\/title/si'
Pour souligner certaines des limitations:
portabilité
Il n'y a pas de commande standard / portable pour effectuer des requêtes HTTP. Il y a quelques décennies, j'aurais recommandé à la lynx -source
place ici. Mais de nos jours, il wget
est plus portable car on peut le trouver par défaut sur la plupart des systèmes GNU (y compris la plupart des systèmes d’exploitation pour ordinateurs de bureau / ordinateurs portables basés sur Linux). Parmi les autres assez portables, citons la GET
commande qui vient avec perl
libwww qui est souvent installée lynx -source
, et dans une moindre mesure curl
. D' autres communes les comprennent links -source
, elinks -source
, w3m -dump_source
, lftp -c cat
...
Protocole HTTP et traitement de la redirection
wget
peut ne pas obtenir la même page que celle firefox
affichée par exemple . La raison en est que les serveurs HTTP peuvent choisir d'envoyer une page différente en fonction des informations fournies dans la demande envoyée par le client.
La requête envoyée par wget / w3m / GET ... va être différente de celle envoyée par firefox. Si cela pose un problème, vous pouvez modifier le wget
comportement pour modifier la manière dont il envoie la demande avec des options.
Les plus importants ici à cet égard sont:
Accept
et Accept-language
: cela indique au serveur dans quelle langue et quel jeu de caractères le client souhaite obtenir la réponse. wget
n'envoie pas de valeur par défaut, le serveur envoie donc avec ses paramètres par défaut. firefox
à l'autre extrémité est probablement configuré pour demander votre langue.
User-Agent
: qui identifie l'application client sur le serveur. Certains sites envoient un contenu différent en fonction du client (bien que ce soit principalement pour des différences entre les interprétations du langage javascript) et peut refuser de vous servir si vous utilisez un agent utilisateur de type robot , comme wget
.
Cookie
: si vous avez déjà visité ce site, votre navigateur peut avoir des cookies permanents pour cela. wget
Ne fera pas.
wget
suivra les redirections quand elles seront terminées au niveau du protocole HTTP, mais comme cela ne regarde pas le contenu de la page, pas celles faites par javascript ou quelque chose comme <meta http-equiv="refresh" content="0; url=http://example.com/">
.
Performance / Efficacité
Ici, par paresse, nous avons perl
lu tout le contenu en mémoire avant de commencer à chercher la <title>
balise. Étant donné que le titre se trouve dans la <head>
section qui se trouve dans les premiers octets du fichier, ce n'est pas optimal. Une meilleure approche, si GNU awk
est disponible sur votre système, pourrait être:
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' |
gawk -v IGNORECASE=1 -v RS='</title' 'RT{gsub(/.*<title[^>]*>/,"");print;exit}'
De cette façon, awk arrête de lire après le premier </title
et, en quittant, wget
arrête le téléchargement.
Analyse du HTML
Ici, wget
écrit la page lorsqu’elle la télécharge. En même temps, perl
glisse sa sortie ( -0777 -n
) en mémoire, puis imprime le code HTML trouvé entre les premières occurrences de <title...>
et </title
.
Cela fonctionnera pour la plupart des pages HTML comportant une <title>
balise, mais dans certains cas, cela ne fonctionnera pas.
En revanche, la solution de coffeeMug analysera la page HTML au format XML et renverra la valeur correspondante pour title
. Il est plus correct de s’assurer que la page est un XML valide . Cependant, il n'est pas nécessaire que HTML soit un XML valide (les anciennes versions du langage ne l'étaient pas) et, comme la plupart des navigateurs sont cléments et acceptent le code HTML incorrect, il existe même de nombreux codes HTML incorrects.
Ma solution et CoffeeMug échoueront dans différents cas, parfois les mêmes, parfois non.
Par exemple, le mien va échouer sur:
<html><head foo="<title>"><title>blah</title></head></html>
ou:
<!-- <title>old</title> --><title>new</title>
Alors que sa volonté échouera sur:
<TITLE>foo</TITLE>
(HTML valide, pas XML) ou:
ou:
<title>...</title>
...
<script>a='<title>'; b='</title>';</script>
(encore une fois, pièces html
manquantes <![CDATA[
pour rendre XML valide).
<title>foo <<<bar>>> baz</title>
(html incorrect, mais toujours trouvé et supporté par la plupart des navigateurs)
interprétation du code à l'intérieur des balises.
Cette solution génère le texte brut entre <title>
et </title>
. Normalement, il ne devrait pas y avoir de balises HTML, il pourrait y avoir des commentaires (bien que certains navigateurs comme Firefox ne les gèrent pas, ce qui est très peu probable). Il peut encore y avoir un encodage HTML:
$ wget -qO- 'http://www.youtube.com/watch?v=CJDhmlMQT60' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
Wallace & Gromit - The Cheesesnatcher Part 1 (claymation) - YouTube
Ce qui est pris en charge par GNU recode
:
$ wget -qO- 'http://www.youtube.com/watch?v=CJDhmlMQT60' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' |
recode html..
Wallace & Gromit - The Cheesesnatcher Part 1 (claymation) - YouTube
Mais un client Web est également censé faire plus de transformations sur ce code lors de l'affichage du titre (par exemple, condenser certaines des blancs, supprimer les premiers et les derniers). Cependant, il est peu probable que cela soit nécessaire. Donc, comme dans les autres cas, c'est à vous de décider si cela en vaut la peine.
Jeu de caractères
Avant UTF-8, iso8859-1 était le jeu de caractères préféré sur le Web pour les caractères non-ASCII bien que, à proprement parler, ils devaient être écrits sous la forme é
. Des versions plus récentes de HTTP et du langage HTML ont ajouté la possibilité de spécifier le jeu de caractères dans les en-têtes HTTP ou HTML, et un client peut spécifier les jeux de caractères qu'il accepte. UTF-8 a tendance à être le jeu de caractères par défaut de nos jours.
Donc, cela signifie que là-bas, vous trouverez é
écrit comme é
, comme , comme é
, comme UTF-8 é
, (0xc3 0xa9), comme iso-8859-1 (0xe9), avec pour les 2 derniers, parfois les informations sur le jeu de caractères dans les en-têtes HTTP ou les en-têtes HTML (dans différents formats), parfois non.
wget
n'obtient que les octets bruts, peu importe leur signification en tant que caractères, ni le serveur Web sur le jeu de caractères préféré.
recode html..
se chargera de convertir le é
ou é
en la séquence d'octets appropriée pour le jeu de caractères utilisé sur votre système, mais pour le reste, c'est plus compliqué.
Si votre jeu de caractères système est utf-8, il y a de fortes chances qu'il fonctionne normalement la plupart du temps, car il s'agit généralement du jeu de caractères par défaut utilisé de nos jours.
$ wget -qO- 'http://www.youtube.com/watch?v=if82MGPJEEQ' |
perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si'
Noir Désir - L'appartement - YouTube
Ce qui é
précède était un UTF-8 é
.
Mais si vous voulez couvrir d'autres jeux de caractères, encore une fois, il faudra en prendre soin.
Il convient également de noter que cette solution ne fonctionnera pas du tout pour les pages codées UTF-16 ou UTF-32.
Pour résumer
Idéalement, ce dont vous avez besoin ici, c'est un véritable navigateur Web pour vous donner les informations. Autrement dit, vous avez besoin de quelque chose pour traiter la requête HTTP avec les paramètres appropriés, interpréter correctement la réponse HTTP, interpréter intégralement le code HTML comme le ferait un navigateur et renvoyer le titre.
Comme je ne pense pas que cela puisse être fait en ligne de commande avec les navigateurs que je connais (bien que vous voyiez maintenant cette astucelynx
), vous devez recourir à des heuristiques et à des approximations, et celle ci-dessus en vaut la peine.
Vous pouvez également prendre en compte les performances, la sécurité ... Par exemple, pour couvrir tous les cas (par exemple, une page Web contenant du javascript extrait d'un site tiers qui définit le titre ou redirige vers une autre page dans une page Web). onload), vous devrez peut-être implémenter un navigateur de la vie réelle avec ses moteurs dom et javascript qui devront peut-être faire des centaines de requêtes pour une seule page HTML, dont certaines tentent d'exploiter des vulnérabilités ...
Bien que l’ utilisation des expressions rationnelles pour analyser le langage HTML soit souvent mal vue , voici un cas typique où il convient assez bien à la tâche (IMO).