View previous topic :: View next topic |
Author |
Message |
v1ll4 n00b
Joined: 26 Feb 2005 Posts: 24
|
Posted: Sat Mar 04, 2006 11:28 pm Post subject: [SCRIPT] script para busqueda web de portage-MEJORADO |
|
|
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 |
|
|
Ferdy Retired Dev
Joined: 04 May 2002 Posts: 483 Location: España
|
|
Back to top |
|
|
eviltwin n00b
Joined: 25 Aug 2005 Posts: 30 Location: Ibiza, Islas Baleares (SP)
|
Posted: Sun Mar 05, 2006 1:13 am Post subject: |
|
|
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 |
|
|
quelcom Guru
Joined: 16 Mar 2004 Posts: 306 Location: Catalonia
|
Posted: Sun Mar 05, 2006 10:11 am Post subject: |
|
|
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
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 |
|
|
alexlm78 Veteran
Joined: 08 Dec 2003 Posts: 1265 Location: Guatemala,Guatemala
|
Posted: Sun Mar 05, 2006 4:07 pm Post subject: |
|
|
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
100% Chapin hecho en Guatemala |
|
Back to top |
|
|
pacho2 Developer
Joined: 04 Mar 2005 Posts: 2599 Location: Oviedo, Spain
|
Posted: Fri Mar 10, 2006 7:33 pm Post subject: |
|
|
Script interesante
Saludos |
|
Back to top |
|
|
v1ll4 n00b
Joined: 26 Feb 2005 Posts: 24
|
Posted: Sat Mar 11, 2006 4:10 pm Post subject: |
|
|
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 |
|
|
|
|
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
|
|