Analyser HTML à l'aide de shell
J'ai une page HTML avec beaucoup de données et de la partie je suis intéressé par:
<tr valign=top>
<td><b>Total</b></td>
<td align=right><b>54</b></td>
<td align=right><b>1</b></td>
<td align=right>0 (0/0)</td>
<td align=right><b>0</b></td>
</tr>
J'essaie d'utiliser awk
qui maintenant est:
awk -F "</*b>|</td>" '/<[b]>.*[0-9]/{print $1, $2, $3 }' "index.html"
mais ce que je veux, c'est avoir:
54
1
0
0
Droit maintenant j'obtiens:
'<td align=right> 54'
'<td align=right> 1'
'<td align=right> 0'
Des suggestions?
Est-il de la 2e à la dernière sortie zéro car il n'y a pas de
<b>
balise ou parce qu'il y a un <td>
valeur de 0 (0/0)
?OriginalL'auteur Lenny | 2014-08-18
Vous devez vous connecter pour publier un commentaire.
De sortie:
L'autre:
getline
. Dans ce cas, il n'y a aucun besoin pour lesgetline
boucle à tous, un simple drapeau feraitf{ subs(..); print; if (!/<td /) exit} /..Total/{f=1}
Vous devez vous déplacer
if (!/<td /) exit
plus tôt. De repérage est une bonne approche de trop en fait mais il est plus facile de venir avec quelque chose qui n'est pas parfois. De repérage est fait quand vous déjà essayer de rendre votre code plus lisse ou plus efficace. Encore une fois surgetline
,getline > 0
est complètement sûr et assez sûr, si vous lisez le manuel correctement. Il est assez clair comment les différentes syntaxes diffèrent en fonction. La seule chose à vraiment prendre en compte est le Le getline commande retourne 1 en cas de succès, 0 en fin de fichier, et -1 en cas d'erreur.Oui, le test sur
!/<td /
viendrait en premier. Considérer les deux approches et maintenant ajouter une exigence dont vous avez besoin pour imprimer toutes les lignes à partir de la ligne 1 jusqu'à que/<td /
ligne dans un fichier nommé "toto" pour le débogage. Notez que si vous utilisez legetline
approche, vous devez placer votreprint > "foo"
à 2 endroits alors qu'avec l'approche normale de laisser awk boucle faire ce qu'il ne vous avez seulement besoin de mettre leprint > "foo"
en un seul endroit. En évitant getline quand il n'est pas nécessaire n'est pas seulement à propos de l'écriture de code sécurisé, à son aussi sur l'écriture de code qui peut être maintenu et étendu facilement.Je ne suis pas d'accord à ce sujet, être étendue facilement. Voir ce code que j'avais écrit il y a longtemps, où les drapeaux (plus de getline) peut à peine s'appliquent: sourceforge.net/p/playshell/code/ci/master/tree/loader/.... La dernière mise à jour que j'ai faite était juste pour s'assurer que
getline
retourne 1, et pas seulement différente de zéro.×Les commentaires peuvent être modifiées seulement 5 minutes×les Commentaires peuvent être modifiées seulement 5 minutes×les Commentaires ne peuvent être modifiés pendant 5 minutesJe viens de faire un simple et de bon exemple de la non-getline code plus facile à étendre. En tout cas, mon commentaire a été réalisé à l'OP, maintenant qu'il est conscient des avantages/inconvénients et les différentes opinions concernant le getline d'utilisation. J'ai regardé votre compilateur de code, et il pourrait avoir été écrit plus solidement et de manière concise sans getline. C'est juste une blague - bien sûr, je ne vais pas lire des centaines de lignes de code awk et essayer de comprendre ce qu'il fait et ce qu'il regarde comme sans getline ou n'importe quel autre type d'analyse.
OriginalL'auteur konsolebox
awk
n'est pas un analyseur HTML. Utilisationxpath
ou mêmexslt
.xmllint
est un outil de ligne de commande qui est capable d'exécuter des requêtes XPath etxsltproc
peut être utilisé pour effectuer des transformations XSL. Les deux outils appartiennent au packagelibxml2-utils
.Vous pouvez également utiliser un langage de programmation qui est capable d'analyser HTML
il est vraiment pas, il peut être incroyablement difficile(pas impossible) pour analyser des segments entiers de manière efficace, mais pour récupérer les petits morceaux de données que la question demande à sa réalité extrêmement facile avec la regex. Tout le monde saute sur le ne pas analyser XML/XHTML/HTML train en marche, sans même en comprendre l'argument, en premier lieu, comme vous pouvez le voir par la tous les upvotes sur cette "réponse". Regardez la accepté de répondre clairement analyse les données en question.
C'est impossible à analyser correctement les données XML à l'aide de regex, pas seulement difficile. La section commentaire est trop court pour une preuve, mais l'chomsky hierarchie est le bon mot clé pour la recherche. C'est scientifiquement prouvé. Tout simplement parce que cela fonctionne dans ce cas ne signifie pas qu'il est correct. Le problème est que regarde correct et c'est pourquoi tant de gens essaient d'utiliser des regex pour analyse XML - Et parce que c'est incorrect et vous ouvre à un monde de douleur pour beaucoup de gens des conseils contre elle. Et à juste titre.
Il n'y aura pas de prouver que. Bien sûr, vous pouvez écrire un analyseur HTML dans
awk
car il est Turing complet. Aussi, vous devez comprendre que l'extraction d'informations à partir d'un fichier texte, et de pleinement comprendre et de représenter un document sont deux choses différentes. Mais bon, je pourrais encore utiliser un prêt-à-utilisation de l'analyseur au lieu d'écrire un programme personnalisé de nouveau et de nouveau avecawk
..ah, je vois. Si awk est turing complet vous sont tout à fait correct (je n'ai pas maintenant beaucoup d'awk, j'ai pensé qu'il est limité aux langages réguliers). Donc, pour résumer: Ne pas utiliser des expressions régulières pour analyser le langage XML. Vous pouvez utiliser awk pour parser le XML, mais vous ne devriez pas (pour les raisons évoquées dans la réponse et ici dans les commentaires).
OriginalL'auteur hek2mgl
C'est bien, mais il faut environ 15 secondes en moyenne pour produire une réponse et à quelques minutes de document en sorte que j'ai le temps de faire l'ancien, mais pas le dernier pour chaque question, en particulier celles qui à mon humble avis sont évidents. Si quelqu'un a des questions je suis heureux d'y répondre.
OriginalL'auteur Ed Morton
Vous devriez vraiment utiliser un peu de réel analyseur HTML pour ce travail, comme:
imprime:
Mais pour cela vous devez avoir de perl, et installé Mojolicious paquet.
(il est facile à installer avec:)
OriginalL'auteur jm666
HTML-XML-utils
Vous pouvez utiliser
htmlutils
pour l'analyse du bien-formaté en HTML/XML fichiers. Le package comprend un grand nombre de binaires outils pour extraire ou modifier les données. Par exemple:Voici l'exemple avec des données fournies:
Voici le dernier exemple avec la suppression
<b>
tags:Pour plus d'exemples, consultez le html-xml-utils.
OriginalL'auteur kenorb
BSD/GNU
grep
/ripgrep
Pour la simple extraction, vous pouvez utiliser
grep
, par exemple:Votre exemple à l'aide de
grep
:et à l'aide de
ripgrep
:Extraction extérieure html de H1:
D'autres exemples:
L'extraction du corps:
au Lieu de
xargs
vous pouvez également utilisertr '\n' ' '
.Plusieurs tags, voir: Le texte entre les deux balises.
Si vous avez affaire à de grands ensembles de données, pensez à utiliser
ripgrep
qui a la même syntaxe, mais c'est une façon plus rapide car il est écrit dans La rouille.OriginalL'auteur kenorb
ex
/vim
Pour plus avancées de l'analyse, vous pouvez utiliser en place des éditeurs tels que ex/vi où vous pouvez sauter entre les correspondants des balises HTML, sélection/suppression d'intérieur/extérieur des balises, et de modifier le contenu en place.
Voici la commande:
C'est de cette façon que la commande fonctionne:
Utilisation
ex
en place de l'éditeur de remplacer sur toutes les lignes (%
) par:ex +"%s/pattern/replace/g"
.La substitution de motif se compose de 3 parties:
>
(^[^>].*>
) pour l'enlèvement, juste avant la 2ème partie.<
(([^<]+)
).<
à la suppression (<.*
).\1
qui se réfère à motif à l'intérieur des crochets (()
).Après la substitution, nous supprimons tout alphanumérique des lignes à l'aide mondial:
g/[a-zA-Z]/d
.+%p
.-s
) quitter sans sauvegarder (-c "q!"
), ou de l'enregistrer dans le fichier (-c "wq"
).Lors de l'essai, afin de remplacer le fichier en place, le changement
-scq!
à-scwq
.Voici un autre exemple simple qui supprime le style de la balise d'en-tête et imprime le analysée de sortie:
Cependant, il est pas conseillé à utiliser des regex pour l'analyse de votre code html, donc pour du long terme, vous devez utiliser la langue appropriée (comme Python, perl ou PHP DOM).
Voir aussi:
OriginalL'auteur kenorb