Usuari:RRHGbot/cercador.py
De Viquipèdia
Guió derivat de replace.py però molt més simple, per cercar coses a la Viqui i desar el nom dels articles que trobi a un fitxer de text.
De moment (ver 0.1) només pot cercar un sol text a un dump xml incloent tots els namespaces
# -*- coding: utf-8 -*-
"""
cercador.py
versió: 0.1
descripció: cerca un text o una expressió regular a un dump xml,
retorna un fitxer amb els noms dels articles,
necessita pyWikipediaFramework
ús: cercador.py [-regex] "text a cercar" -xml:xmldump -bitacora:fitxer_bitàcora
"text a cercar" és el text que es vol cercar, pot ser una expressió regular
si el paràmetre opcional "-regex" s'ha especificat
"xmldump" ha de ser un fitxer de dump de http://download.wikipedia.org en format xml,
el que conté les versions actuals dels articles és: pages-articles.xml.bz2
-bitacora "fitxer_bitàcora" especifiqueu un fitxer on desar els resultats.
"""
from __future__ import generators
import sys, re, fileinput, xmlreader
import wikipedia, pagegenerators, catlib, config
def main():
cerca = u'' # text o regex
regex = False
diff = False
nombre = 0
bitacora = u''
for arg in sys.argv[1:]:
arg = wikipedia.argHandler(arg, 'cercador')
if arg:
if arg == '-regex':
regex = True
elif arg == '-diff':
diff = True
elif arg.startswith('-xml'):
fitxer_xml = arg[5:]
elif arg.startswith('-bitacora'):
fitxer_log = arg[10:]
else:
cerca = arg
if (not fitxer_xml) or (not fitxer_log):
sys.exit ("ERROR:manca fitxer_xml o fitxer_bitacora")
if regex :
cerca_re = re.compile(cerca, re.UNICODE)
bitacora = "Articles que contenen " + cerca + ":\n"
mysite = wikipedia.getSite()
dump = xmlreader.XmlDump(fitxer_xml)
for entry in dump.parse():
if regex:
if cerca_re.search(entry.text):
bitacora = bitacora + entry.title + "\n"
nombre = nombre + 1
print entry.title + " ",
else:
if entry.text.find(cerca) != -1:
bitacora = bitacora + entry.title + "\n"
nombre = nombre + 1
print entry.title + " ",
bitacora = bitacora + "----\nNombre d'articles trobats: " + str(nombre)
bitacora = bitacora.encode('utf-8')
fitxer_sortida = file ( fitxer_log, 'w' )
fitxer_sortida.write ( bitacora )
fitxer_sortida.close ()
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()

