Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SCRIPT] script para busqueda web de portage-MEJORADO
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Spanish
View previous topic :: View next topic  
Author Message
v1ll4
n00b
n00b


Joined: 26 Feb 2005
Posts: 24

PostPosted: Sat Mar 04, 2006 11:28 pm    Post subject: [SCRIPT] script para busqueda web de portage-MEJORADO Reply with quote

Visto que siempre que buscaba algo en el portage, lo hacia a traves de su pagina web que es muchisimo mas rápido que buscarlo a traves de emerge, me decidí a intentar implementarlo para usarlo en consola.
El script no es nada profesional y deja mucho que desear, no iba a postearlo pero bueno , pensando en la filosofia de gentoo, pues mira, igual a partir de aqui la gente lo va mejorando y quedo algo chulo.

Yo durante 2 dias me ha ido mas o menos bien , se puede mejorar, pero para lo que yo lo queria me funcionaba, bueno , aqui dejo la salida del scrip para que se vea como funciona mas o menos :

Code:

villa@villa-portatil pruebas $ time ./busqueda_portage firefox
---------------------------------
NOMBRE :        mozilla-firefox-bin
DESCRIPCION :   Firefox Web Browser
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>1.5.0  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<
>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<
>1.0.7  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
---------------------------------
NOMBRE :        mozilla-firefox
DESCRIPCION :   Firefox Web Browser
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>1.5.0  >-<     >~<     >-<     >-<     >~<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>1.0.7  >+<     >+<     >~<     >+<     >+<     >-<     >+<     >-<     >-<     >-<     >-<     >+<     >+<
---------------------------------
NOMBRE :        mozilla-launcher
DESCRIPCION :   Script that launches mozilla or firefox
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>1.47<  >~<     >~<     >~<     >~<     >~<     >~<     >~<     >~<     >-<     >-<     >-<     >~<     >~<
>1.45<  >+<     >+<     >+<     >+<     >+<     >+<     >+<     >+<     >-<     >-<     >-<     >+<     >+<

real    0m3.129s
user    0m0.114s
sys     0m0.008s
villa@villa-portatil pruebas $ time emerge -s firefox
Searching...
[ Results for search key : firefox ]
[ Applications found : 2 ]

*  www-client/mozilla-firefox
      Latest version available: 1.5.0.1-r1
      Latest version installed: [ Not Installed ]
      Size of files: 117,945 kB
      Homepage:      http://www.mozilla.org/projects/firefox/
      Description:   Firefox Web Browser
      License:       MPL-1.1 NPL-1.1

*  www-client/mozilla-firefox-bin
      Latest version available: 1.5.0.1
      Latest version installed: 1.0.7
      Size of files: 40,939 kB
      Homepage:      http://www.mozilla.org/projects/firefox
      Description:   Firefox Web Browser
      License:       MPL-1.1 NPL-1.1



real    0m21.102s
user    0m0.756s
sys     0m0.146s


Yo lo uso como complemento a las herramientas que dispone gentoo para la busqueda, bueno , el codigo del script, está en python.

Code:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#villa-3-2006

import urllib2
import sys
import re

def coger_argumentos():#coge los paquetes a buscar de la linea de comandos
    palabra = sys.argv[1:]
    if len(palabra)>1:
        palabra='+'.join(palabra)
        return palabra
    elif len(palabra)==1: return palabra[0]
    else:
        print 'inserte el paquete a buscar'
   
def mostrar_busqueda(busqueda):#realiza la separacion de toda la pagina a solo las tablas donde estan los datos
    respuesta = []
    encontrado= -1
    segPasada=0
    for linea in busqueda:
        '''primera pasada del bucle'''
        encontrado = linea.find('<table class="ebuild">')
        if (encontrado > -1) or (segPasada==1):
            segPasada=1
            if linea.find('<tr><td class="fields">')>=0:
                respuesta.append(linea)
            if linea.find('<tr><td class="item"><b>Description: </b>')>=0:
                respuesta.append(linea)
            if linea.find('<th class="releases"><a')>=0:
                respuesta.append(linea)
            if linea.find('<td class="archcell')>=0:
                respuesta.append(linea)
            if linea.find('<!-- #exec cmd="/usr/bin/python -O search.py $QUERY_STRING" -->')>=0:
                return respuesta
   
def separar_busqueda(busqueda):#separa la gran lista en elementos de cada paquete encontrado
    elementos = 0
    lineas=[]
    paketes=[]
    for linea in range(len(busqueda)):
        if '<tr><td class="fields">' in busqueda[linea]:
            elementos=elementos+1
            lineas.append(linea)
    actual=0
    while (actual<elementos-1):
        paketes.append(busqueda[lineas[actual]:lineas[actual+1]])
        actual = actual + 1
    paketes.append(busqueda[lineas[actual]:])
    return paketes
    #except TypeError:
        #print "¡Huy! No es un número. Prueba de nuevo..."
       
   
def tratar_elemento(elemento):#analiza y trata cada uno de los elementos sacando la informacion de cada uno
    rex=re.compile("\>.*?\<")
    caracteristicas=[]
    estados=[]
    versiones=[]
    for linea in elemento:
        linea =linea.replace('<tr><td class="fields">','')
        linea = linea.replace('</td></tr>','')
        linea = linea.replace('<tr><td class="item"><b>Description: </b>','')
        linea = linea.replace('\n','')
        caracteristicas.append(linea)
    print '---------------------------------'
    print 'NOMBRE :'+caracteristicas[0]
    print 'DESCRIPCION :'+caracteristicas[1]
    titulo = 'VER alpha  amd64   arm   hppa  ia64    mips    ppc ppc64   macos   s390    sh  sparc   x86'
    titulo = titulo.split()
    titulo = '\t'.join(titulo)
    print titulo
    for linea in caracteristicas[2:]:
        if '<th class="releases">' in linea:
            version = rex.findall(linea)
            if len(version[1]) > 6:
                version[1] = version[1][0:6]
            versiones.append(version)
        if '<td class="archcell"' in linea:
            estado = rex.findall(linea)
            estados.append('\t'.join(estado)) 
    estados = tratar_estados(estados)
    for num in range(len(versiones)):
        print versiones[num][1]+'  '+estados[num]
   
def tratar_estados(estados):
    tablas = len(estados)/13
    numero = 1
    lis = []
    respuesta=[]
    while (numero <= tablas):
        principio = 13*(numero-1)
        final = 13*numero
        lis.append(estados[principio:final])
        numero = numero + 1
    for elem in lis:
        estados = '\t'.join(elem)
        respuesta.append(estados)
    return respuesta
   
def comprobar_resultados(busqueda):
    for linea in busqueda:
        if 'Nothing found.' in linea:return 0
    return 1
           
   

   
parametros = 'sstring='+coger_argumentos()
busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)
bus = busqueda
estado = comprobar_resultados(bus)
if estado :
    busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)
    respuesta = mostrar_busqueda(busqueda)
    elementos = separar_busqueda(respuesta)
    for elemento in elementos:
        tratar_elemento(elemento)
else:
    print 'No se han encontrado resultados en el portage para : '+coger_argumentos()
   


El script esta testeado lo poco que le he dicho buscar en estos dias y de cuando lo programé, pero bueno , que si le salen fallos pues los intentamos corregir.
El fallo que sé que tiene es que si el paquete a buscar, en la pagina web del portage tiene mas de una pagina , el script solo mira la primera, los 9 primeros resultados creo que son.

Bueno, por si hay algun novato que no creo , copiar el script , guardar como busqueda_portage o el nombre que se quiera, y teclear : chmod +x busqueda_portage y luego añadir al path.

Saludos
_________________
In Ballantines we trust


Last edited by v1ll4 on Sat Mar 11, 2006 4:14 pm; edited 1 time in total
Back to top
View user's profile Send private message
Ferdy
Retired Dev
Retired Dev


Joined: 04 May 2002
Posts: 483
Location: España

PostPosted: Sun Mar 05, 2006 12:24 am    Post subject: Reply with quote

Siempre se agradecen este tipo de scripts, de todas formas quizá quieras echarle un vistazo a:

http://dev.gentoo.org/~ciaranm/toys/eshowkw

Saludos.Ferdy
Back to top
View user's profile Send private message
eviltwin
n00b
n00b


Joined: 25 Aug 2005
Posts: 30
Location: Ibiza, Islas Baleares (SP)

PostPosted: Sun Mar 05, 2006 1:13 am    Post subject: Reply with quote

v1ll4 wrote:
Visto que siempre que buscaba algo en el portage, lo hacia a traves de su pagina web que es muchisimo mas rápido que buscarlo a traves de emerge, me decidí a intentar implementarlo para usarlo en consola.


¿No has probado eix? Yo (al igual que mucha gente) lo uso, va como un tiro :) A mí me hace el apaño muy bien, jeje. Igualmente, gracias por compartir el script.

Un saludo!!
Back to top
View user's profile Send private message
quelcom
Guru
Guru


Joined: 16 Mar 2004
Posts: 306
Location: Catalonia

PostPosted: Sun Mar 05, 2006 10:11 am    Post subject: Reply with quote

eviltwin wrote:

¿No has probado eix? Yo (al igual que mucha gente) lo uso, va como un tiro :) A mí me hace el apaño muy bien, jeje. Igualmente, gracias por compartir el script.


No creo que el proposito del script sea sustituir a eix. Piensa que eix trabaja sobre tu árbol local y, por lo tanto, nunca tienes la última información que si aparece en packages.gentoo.org Es especialmente útil para los que, como yo, no syncean a diario y quieran ver que hay de nuevo sin recurrir a la web.

v1ll4, está muy bien el script, aunque hay el problema que si el resultado devuelve más de una página estos no aparecen (por lo tanto está limitado a las 20 primeras ocurrencias).

Da la casualidad que hace tiempo hice una cosa parecida, aunque no está solucionado el problema de la limitación de resultados (algun día lo tendría que arreglar).

Mi script está doblemente guarro (por ser Perl y por no haber comentarios) pero lo dejo por si sirve de inspiración. Intentaré coger ideas de tu script, pero yo de Python ni papa :oops:

Code:


#!/usr/bin/env perl
use strict;
use WWW::Mechanize;
use Term::ANSIColor;

my $count = 0;
my $version;
my $liner;
my %archs = ("alpha"=>1,"amd64"=>2,"arm"=>3,"hppa"=>4,"ia64"=>5,
        "mips"=>6,"ppc"=>7,"ppc64"=>8,"ppc_macos"=>9,"s390"=>10,
        "sh"=>11,"sparc"=>12,"x86"=>13);

my $mech = WWW::Mechanize->new( autocheck => 1 );
my $url = "http://packages.gentoo.org/search/?sstring=".$ARGV[0];

$mech->agent_alias ( 'Linux Mozilla' );
$mech->get( $url );

if ($mech->success()) {
   print "\nRetrieved ".$mech->uri();
}

$mech->save_content("query.txt");
open LOG, "query.txt";

while (<LOG>) {
   if (/<table class="ebuild">/) {
      $count++;
      print "\n";
   }
   if (/<tr><td class="fields">(\S+)<\/td><\/tr>/) {
      print color 'reset bold';
      print "\n$1 ";
      print color 'reset';
      $liner = <LOG>;
      if ($liner =~ /<b>Description:(\s+)<\/b>(.*)<\/td><\/tr>/) {
         print "\nDescription: $2\nVersions:";
      }
         
   }
   if (/<a href="http:\/\/packages\.gentoo\.org\/ebuilds\/\?(\S+)-(\d+\S*)"/) {
      $version = $2;
      $liner = <LOG>;
      my $contador=0;
      while ($contador != $archs{$ARGV[1]}) {
         $liner = <LOG>;
         $contador++;
      }
      if ($liner =~ /<td class="archcell" arch="(\S+)">(\S+)<\/td>/) {
         $_ = $1;
         SWITCH: {
            if (/\+/) { print color 'green'; last SWITCH; };
            if (/M(\S+)/) { print color 'red'; last SWITCH; };
            if (/~/) { print color 'yellow'; last SWITCH; };
            print color 'reset';
         }
         print " $version ";
      }   
   }

   if (/class="homepage" href="(.*)">Homepage/) {
      print color 'reset';
      print "\nHomepage: $1";
   }
   
}
close LOG;
print color 'reset';
print "\n\n$count Register(s) Found\n";



Requisitos:
dev-perl/WWW-Mechanize
dev-perl/Term-ANSIColor

Uso:
./peix.pl <paquete> <arch>

Saludos
Back to top
View user's profile Send private message
alexlm78
Veteran
Veteran


Joined: 08 Dec 2003
Posts: 1265
Location: Guatemala,Guatemala

PostPosted: Sun Mar 05, 2006 4:07 pm    Post subject: Reply with quote

Gracias por los datos, como dijo Ferdy, esto siempre se agradece, vamos a ver que se puede modificar con esto y que mas provecho se le puede sacar.

Saluditos.
_________________
"This is a different kind of world, you need a different kind of software"

Linux User# 315201
www.alexlm78.org
www.dcforfans.org
100% Chapin hecho en Guatemala
Back to top
View user's profile Send private message
pacho2
Developer
Developer


Joined: 04 Mar 2005
Posts: 2582
Location: Oviedo, Spain

PostPosted: Fri Mar 10, 2006 7:33 pm    Post subject: Reply with quote

Script interesante :)

Saludos
Back to top
View user's profile Send private message
v1ll4
n00b
n00b


Joined: 26 Feb 2005
Posts: 24

PostPosted: Sat Mar 11, 2006 4:10 pm    Post subject: Reply with quote

Después de comer me he puesto a ver si arreglaba el fallo de que solo mostraba los 20 primeros resultados en caso de que la busqueda diera como resultado mas de 20.
Lo he ido cambiando sobre la marcha ahora mismo y he hecho unas cuantas busquedas de prueba y ya hace las busquedas completas.
Code:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#-villa-11-03-06 - v.2

import urllib2
import sys
import re

def coger_argumentos():#coge los paquetes a buscar de la linea de comandos
    palabra = sys.argv[1:]
    if len(palabra)>1:
        palabra='+'.join(palabra)
        return palabra
    elif len(palabra)==1: return palabra[0]
    else:
        print 'ERROR SINTAXIS . TRY -> '+sys.argv[0]+ ' NAME'
       
def mostrar_busqueda(busqueda):#realiza la separacion de toda la pagina a solo las tablas donde estan los datos
    respuesta = []
    encontrado= -1
    segPasada=0
    for linea in busqueda:
        '''primera pasada del bucle'''
        encontrado = linea.find('<table class="ebuild">')
        if (encontrado > -1) or (segPasada==1):
            segPasada=1
            if linea.find('<tr><td class="fields">')>=0:
                respuesta.append(linea)
            if linea.find('<tr><td class="item"><b>Description: </b>')>=0:
                respuesta.append(linea)
            if linea.find('<th class="releases"><a')>=0:
                respuesta.append(linea)
            if linea.find('<td class="archcell')>=0:
                respuesta.append(linea)
            if linea.find('<!-- #exec cmd="/usr/bin/python -O search.py $QUERY_STRING" -->')>=0:
                return respuesta
   
def separar_busqueda(busqueda):#separa la gran lista en elementos de cada paquete encontrado
    elementos = 0
    lineas=[]
    paketes=[]
    for linea in range(len(busqueda)):
        if '<tr><td class="fields">' in busqueda[linea]:
            elementos=elementos+1
            lineas.append(linea)
    actual=0
    while (actual<elementos-1):
        paketes.append(busqueda[lineas[actual]:lineas[actual+1]])
        actual = actual + 1
    paketes.append(busqueda[lineas[actual]:])
    return paketes
       
   
def tratar_elemento(elemento):#analiza y trata cada uno de los elementos sacando la informacion de cada uno
    rex=re.compile("\>.*?\<")
    caracteristicas=[]
    estados=[]
    versiones=[]
    for linea in elemento:
        linea =linea.replace('<tr><td class="fields">','')
        linea = linea.replace('</td></tr>','')
        linea = linea.replace('<tr><td class="item"><b>Description: </b>','')
        linea = linea.replace('\n','')
        caracteristicas.append(linea)
    print '---------------------------------'
    print 'NOMBRE :'+caracteristicas[0]
    print 'DESCRIPCION :'+caracteristicas[1]
    titulo = 'VER alpha  amd64   arm   hppa  ia64    mips    ppc ppc64   macos   s390    sh  sparc   x86'
    titulo = titulo.split()
    titulo = '\t'.join(titulo)
    print titulo
    for linea in caracteristicas[2:]:
        if '<th class="releases">' in linea:
            version = rex.findall(linea)
            if len(version[1]) > 6:
                version[1] = version[1][0:6]
            versiones.append(version)
        if '<td class="archcell"' in linea:
            estado = rex.findall(linea)
            estados.append('\t'.join(estado)) 
    estados = tratar_estados(estados)
    for num in range(len(versiones)):
        print versiones[num][1]+'  '+estados[num]
   
def tratar_estados(estados):
    tablas = len(estados)/13
    numero = 1
    lis = []
    respuesta=[]
    while (numero <= tablas):
        principio = 13*(numero-1)
        final = 13*numero
        lis.append(estados[principio:final])
        numero = numero + 1
    for elem in lis:
        estados = '\t'.join(elem)
        respuesta.append(estados)
    return respuesta
   
def comprobar_resultados(busqueda):
    numeros = []
    for linea in busqueda:
        if 'Nothing found.' in linea:return 0
        if '<b>Results' in linea:
            linea =linea.replace('<b>','')
            linea = linea.replace('</b><br>','')
            return linea.split()
           
           
   

argumentos=coger_argumentos()
if argumentos!=None:
    parametros = 'sstring='+argumentos
    busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)
    bus = busqueda
    estado = comprobar_resultados(bus)
    if estado :
        print estado[1]+' - '+estado[3]+' of '+estado[5]
        busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)
        respuesta = mostrar_busqueda(busqueda)
        elementos = separar_busqueda(respuesta)
        for elemento in elementos:
            tratar_elemento(elemento)
        if estado[5] > 20:
            vueltas = int(float(estado[5])/20)
            for num in range(vueltas):
                print'----------------------------------------------------------------------\n'
                print ' '+str(20*num+21)+' - '+str(estado[5])
                entrada=raw_input('PRESS ENTER OR "n" to exit\n')
                print'----------------------------------------------------------------------\n'           
                if entrada=='n':break
                busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros+';offset='+str(num*20+20))
                respuesta = mostrar_busqueda(busqueda)
                elementos = separar_busqueda(respuesta)
                for elemento in elementos:
                    tratar_elemento(elemento)
           
    else:
        print 'I could not find any ebuild to '+argumentos


El script es el mismo , lo unico que cambia respecto al anterior es que cada vez que los resultados pasan de 20 saca esto por pantalla :
Code:

---------------------------------
NOMBRE :        tvtime
DESCRIPCION :   High quality television application for use with video capture cards.
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>1.0.2  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>1.0.1  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>0.99<  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>0.9.1  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
>0.9.1  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
---------------------------------
NOMBRE :        dfbsee
DESCRIPCION :   DFBSee is image viewer and video player based on DirectFB
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>0.7.4  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<
>0.7.4  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
----------------------------------------------------------------------

 21 - 165
PRESS ENTER OR "n" to exit

----------------------------------------------------------------------

---------------------------------
NOMBRE :        avidemux
DESCRIPCION :   Great Video editing/encoding tool
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>2.1_p  >-<     >M~<    >-<     >-<     >-<     >-<     >M~<    >-<     >-<     >-<     >-<     >-<     >M~<
>2.0.4  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<
>2.0.2  >-<     >~<     >-<     >-<     >-<     >-<     >+<     >-<     >-<     >-<     >-<     >-<     >+<
---------------------------------
NOMBRE :        binkplayer
DESCRIPCION :   Bink Video! Player
VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86
>1.8h<  >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
>1.8c<  >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<
---------------------------------


En este caso , la parte de arriba ha mostrado hasta la 20 y en caso de que no pulses la tecla 'n' , mostraría las 20 siguientes y volvería a preguntar, así hasta llegar al total.

Saludos
_________________
In Ballantines we trust
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Spanish All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum