2010-06-13 2 views
3

Compte tenu de cette commande curl: --user agent boucle "fogent" --silent -o page.html "http://www.google.com/search?q=insansiate"une chaîne spécifique d'un résultat curl'd

* L'orthographe est volontairement incorrecte. Je veux saisir la suggestion comme résultat. Je veux être capable de grep dans le fichier page.html peut-être avec grep -oE ou le rediriger directement à partir de curl et ne jamais stocker un fichier.

Le résultat devrait être: « instancier »

J'ai besoin que le mot « instancier », ou l'expression, quelle que soit Google est correctrice automatique, est ce que je suis après.

Voici le code html de base qui est retourné:

<span class=spell style="color:#cc0000">Did you mean: </span><a href="/search?hl=en&amp;ie=UTF-8&amp;&amp;sa=X&amp;ei=VEMUTMDqGoOINraK3NwL&amp;ved=0CB0QBSgA&amp;q=instantiate&amp;spell=1"class=spell><b><i>instantiate</i></b></a>&nbsp;&nbsp;<span class=std>Top 2 results shown</span> 

Alors peut-être de/à la chaîne ci-dessous, je l'espère, est assez unique pour couvrir toutes mes bases. Je continue de rencontrer des problèmes avec grep greedy; peut-être que je devrais le faire passer par un outil HTML avant d'obtenir un saut de ligne ou 50 là-dedans. Je ne connais pas de moyen simple de le faire à bash, et c'est ce que j'aimerais idéalement que ce soit. Je ne veux vraiment pas parler de mettre le feu à perl, et m'assurer que j'ai le bon module.

Des suggestions, merci?

Répondre

0

curl ->tidy -asxml ->xmlstarlet sel

0

Edit: Désolé, ne trouvez pas votre avis Perl.

#!/Usr/bin/perl use strict; utilisez LWP :: UserAgent;

my $arg = shift // 'insansiate'; 

my $lwp = LWP::UserAgent->new(agent => 'Mozilla'); 
my $c = $lwp->get("http://www.google.com/search?q=$arg") or die $!; 

my @content = split(/:/, $c->content); 

for(@content) { 
    if(m;<b><i>(.+)</i></b>;) { 
    print "$1\n"; 
    exit; 
    } 
} 

Course à pied:

> perl google.pl 
    instantiate 
> perl google.pl disconect 
    disconnect 
4

Comme je suis sûr que vous êtes au courant, screen scraping est une entreprise délicate. Cette séquence de commandes ne fait pas exception puisqu'elle repose sur la structure spécifique de la page qui peut changer à tout moment sans préavis.

grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/' page.html 

Dans un tuyau:

curl --user-agent "fogent" --silent "http://www.google.com/search?q=insansiate" | grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/' 

Cela repose sur la recherche de cinq caractères « > » entre « Vouliez-vous dire: » et le « </i> » après le mot que vous recherchez.

Avez-vous envisagé d'autres moyens d'obtenir des suggestions d'orthographe ou êtes-vous intéressé par ce que Google propose?

Si vous avez ispell ou aspell installé, vous pouvez faire:

echo insansiate | ispell -a 

et analyser le résultat.

1

xidel est un excellent utilitaire pour graver des pages Web; il prend en charge la récupération de pages et l'extraction d'informations dans différents langages de requête (sélecteurs CSS, XPath). Dans le cas présent, le simple sélecteur CSS a.spell fera l'affaire.

xidel --user-agent "fogent" "http://google.com/search?q=insansiate" -e 'a.spell' 

Notez comment xidel effectue sa propre extraction de pages, donc pas besoin de curl dans ce cas.

Toutefois, si vous avez eu besoin curl pour les options de récupération plus exotiques, voici comment vous combinez les deux outils (saut de ligne pour une meilleure lisibilité):

curl --user-agent "fogent" --silent "http://google.com/search?q=insansiate" | 
xidel - -e 'a.spell' 
Questions connexes