Vés al contingut

Usuari:RRHGbot/cercador.py

De la Viquipèdia, l'enciclopèdia lliure

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()