Je veux récupérer tout ce qui se trouve entre ces deux balises - <tr> </tr>
- à partir d'un document html. Maintenant, je n'ai pas d'exigences HTML spécifiques qui justifieraient un analyseur HTML. J'ai simplement besoin de quelque chose qui corresponde <tr>
et </tr>
obtienne tout entre les deux et il pourrait y avoir plusieurs tr
s. J'ai essayé awk, qui fonctionne, mais pour une raison quelconque, il finit par me donner des doublons de chaque ligne extraite.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Que faire à ce propos?
shell-script
text-processing
sed
awk
html
TechJack
la source
la source
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Publiez un exemple d'entrée et de sortie attendue si cela ne fonctionne pas.awk
fonctionne mais donne des doublons essayez de passer la sortie de votre awksort -u
pour les rendre distinctsRéponses:
Si vous ne voulez que
...
de tout,<tr>...</tr>
faites:grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
Pour les multilignes:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Vérifiez d'abord le HTMLFILE du caractère "|" (pas habituel, mais possible) et s'il existe, changez-en un qui n'existe pas.
la source
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
donnefooblabar
. Lebla
ne devrait pas être là?grep -Po '<tr>.*?</tr>'
retournerait un résultat par ligne dans le cas de @ NN, mais ce n'est pas portable.Vous avez une exigence qui garantit un analyseur HTML: vous devez analyser HTML. Perl HTML :: TreeBuilder , Python BeautifulSoup et d' autres sont faciles à utiliser, plus facile que d' écrire des expressions régulières complexes et fragiles.
ou
la source
sed
etawk
ne sont pas bien adaptés à cette tâche, vous devriez plutôt utiliser un analyseur html approprié. Par exemplehxselect
de w3.org:la source
hxselect
fait du très bon travail avec des documents html / xml bien formés. En outre, il est plus rapide à utiliser que perl, python et autres. Je pense quehxselect
c'est un bon compromis entresed
/awk
et les bibliothèques d'analyseurs.hxselect
air bien, va certainement l'explorer davantage. Merci.hxnormalize
prend en charge les fichiers html / xml mal formés.Si
ruby
est disponible, vous pouvez effectuer les opérations suivantesoù
file
est votre fichier html d'entrée. La commande exécute un Ruby one-liner. Tout d' abord, il lit toutes les lignes defile
et les joint à une chaîne,readlines.join
. Puis, de la chaîne , il sélectionne quoi que ce soit entre (mais non compris)<tr>
et<\/tr>
qui est un caractère ou plus sans tenir compte de nouvelles lignes,[/(?<=<tr>).+(?=<\/tr>)/m]
. Ensuite, il supprime tout<tr>
ou</tr>
de la chaînegsub(/<\/?tr>/, "")
(cela est nécessaire pour gérer lestr
balises imbriquées ). Enfin, elle imprime la chaîne,puts
.Vous avez dit qu'un analyseur HTML n'est pas garanti pour vous, mais qu'il est très facile à utiliser avec Nokogiri
ruby
et rend la commande plus simple.-rnokogiri
charge Nokogiri.Nokogiri::HTML(readlines.join)
lit toutes les lignes defile
.xpath("//tr")
sélectionne chaquetr
élément etmap { |e| e.content }
sélectionne le contenu de chaque élément, c'est-à-dire ce qui est entre<tr>
et</tr>
.la source
grep
Pour récupérer le contenu d'une
tr
balise sur plusieurs lignes, passez-le d'xargs
abord, par exemple:Pour renvoyer uniquement du HTML interne, utilisez:
Vérifiez la syntaxe des
perlre
modèles étendus .Remarque: Pour des performances plus rapides, vous pouvez envisager celui
ripgrep
qui a une syntaxe similaire.la source
pup
Exemple utilisant
pup
(qui utilise des sélecteurs CSS ):Pour imprimer le texte seulement sans balises, utilisez:
pup -f myfile.html tr text{}
.Voici quelques exemples avec
curl
:xpup
Exemple d'utilisation
xpup
pour l'analyse HTML / XML (qui prend en charge XPath):la source
si c'est juste une liste rapide de
<tr>
s, cela pourrait aider:à votre santé
la source