web-dev-qa-db-fra.com

Comment effacer tous les liens d'un fichier HTML en Bash, Grep ou batch et les stocker dans un fichier texte

J'ai un fichier qui est HTML , et il a environ 150 balises d'ancrage. Je n'ai besoin que des liens de ces balises, AKA, <a href="*http://www.google.com*"></a>. Je souhaite obtenir uniquement la partie http://www.google.com .

Quand je lance un grep,

cat website.htm | grep -E '<a href=".*">' > links.txt

cela me renvoie la ligne entière qu'il a trouvée sur pas le lien que je veux, alors j'ai essayé d'utiliser une commande cut :

cat drawspace.txt | grep -E '<a href=".*">' | cut -d’”’ --output-delimiter=$'\n' > links.txt

Sauf que c'est faux et que ça ne marche pas, donnez-moi une erreur à propos des mauvais paramètres ... Donc, je suppose que le fichier était supposé être transmis aussi. Peut-être aimer cut -d’”’ --output-delimiter=$'\n' grepedText.txt > links.txt.

Mais je voulais faire cela dans une commande si possible ... Alors j'ai essayé de faire une commande AWK .

cat drawspace.txt | grep '<a href=".*">' | awk '{print $2}’

Mais cela ne fonctionnerait pas non plus. Il me demandait plus de contribution, parce que je n'avais pas fini ...

J'ai essayé d'écrire un fichier de commandes et il m'a dit que FINDSTR n'était pas une commande interne ou externe ... Donc, je suppose que mes variables d'environnement ont été gâchées et que, plutôt que de réparer, j'ai essayé d'installer grep sous Windows, mais cela m'a donné la même erreur. ....

La question qui se pose est la suivante: quel est le bon moyen de supprimer les liens HTTP de HTML ? Sur ce, je vais le faire fonctionner pour ma situation.

P.S. J'ai lu tellement de liens/messages de débordement de pile que montrer mes références prendrait trop de temps .... Si un exemple HTML est nécessaire pour montrer la complexité du processus, je l'ajouterai.

J'ai aussi un Mac et un PC que j'ai alternés entre eux pour utiliser leurs commandes Shell/batch/grep/terminal, donc l'un ou l'autre m'aidera.

Je tiens également à signaler que je suis dans le bon répertoire

Enter image description here

HTML:

<tr valign="top">
    <td class="beginner">
      B03&nbsp;&nbsp;
    </td>
    <td>
        <a href="http://www.drawspace.com/lessons/b03/simple-symmetry">Simple Symmetry</a>  </td>
</tr>

<tr valign="top">
  <td class="beginner">
    B04&nbsp;&nbsp;
  </td>
  <td>
      <a href="http://www.drawspace.com/lessons/b04/faces-and-a-vase">Faces and a Vase</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
      B05&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b05/blind-contour-drawing">Blind Contour Drawing</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
        B06&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b06/seeing-values">Seeing Values</a> </td>
</tr>

Production attendue:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
etc.
10
A'sa Dickens
$ sed -n 's/.*href="\([^"]*\).*/\1/p' file
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
21
Ed Morton

Vous pouvez utiliser grep pour cela:

grep -Po '(?<=href=")[^"]*' file

Tout est imprimé après href=" jusqu'à l'apparition d'un nouveau guillemet double.

Avec votre saisie, il retourne:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values

Notez qu'il n'est pas nécessaire d'écrire cat drawspace.txt | grep '<a href=".*">', vous pouvez vous débarrasser de l'utilisation inutile de de cat avec grep '<a href=".*">' drawspace.txt.

Un autre exemple

$ cat a
hello <a href="httafasdf">asdas</a>
hello <a href="hello">asdas</a>
other things

$ grep -Po '(?<=href=")[^"]*' a
httafasdf
hello
18
fedorqui

À mon avis, la commande lynx ne sera pas installée par défaut sur votre PC ou votre Mac (elle est disponible gratuitement sur le Web), mais Lynx vous permettra de procéder comme suit:

$ lynx -dump -image_links -listonly /usr/share/xdiagnose/workloads/youtube-reload.html

Sortie: Références

  1. file: //localhost/usr/share/xdiagnose/workloads/youtube-reload.html
  2. http://www.youtube.com/v/zeNXuC3N5TQ&hl=fr&fs=1&autoplay=1

C’est alors simple à grep pour les lignes http :. Et il peut même y avoir des options lynx pour imprimer uniquement les lignes http: (Lynx a beaucoup, beaucoup d'options).

4
Michael

Selon les commentaires de triplee , l'utilisation de regex pour analyser des fichiers HTML ou XML n'est essentiellement pas effectuée. Des outils tels que sed et awk sont extrêmement puissants pour la gestion de fichiers texte, mais s’agissant de l’analyse de données à structure complexe - telles que XML, HTML, JSON, ... - ils ne sont plus qu’un sledgehammer. Oui, vous pouvez faire le travail, mais parfois à un coût énorme. Pour traiter des fichiers aussi délicats, vous avez besoin d’un peu plus de finesse en utilisant un ensemble d’outils plus ciblé.

En cas d'analyse XML ou HTML, on peut facilement utiliser xmlstarlet .

Dans le cas d'un fichier XHTML, vous pouvez utiliser:

xmlstarlet sel --html  -N "x=http://www.w3.org/1999/xhtml" \
               -t -m '//x:a/@href' -v . -n

-N donne l’espace de nom XHTML, le cas échéant, est reconnu par 

<html xmlns="http://www.w3.org/1999/xhtml">

Cependant, comme les pages HTML ne sont souvent pas bien formées en XML, il peut être pratique de le nettoyer un peu en utilisant tidy . Dans l'exemple ci-dessus, cela donne alors:

$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
  | xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
                   -t -m '//x:a/@href' -v . -n
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
1
kvantour

Utilisez grep pour extraire toutes les lignes contenant des liens, puis sed pour extraire les URL:

grep -o '<a href=".*">' *.html | sed 's/\(<a href="\|\">\)//g' > link.txt;
0
Sathish