Viquipèdia Discussió:Viquitrobada 2009/Taller de bots/Bot que tradueix enllaços interns/Arxiu 1

Expressió regular pels enllaços interns

El que he vist és que per extreure el títol d'un enllaç intern, es pot emprar una única expressió regular. Seria la següent:

ER_interns = re.compile( r'\[\[([^|:]+?)(?:\|[^\]]+)??\]\]' )

Intente a continuació explicar com arribar a obtenir l'anterior ER:

  • Cerquem un text dins de dobles claudators, podria ser simplement:
"\[\[[^\]]+?\]\]"
  • Cerquem un text que està separat per una barra vertical, dins de dobles claudàtors:
"\[\[[^\|]+?\|[^\]]+?\]\]"
  • Volem emmagatzemar el primer element d'un text separat per una barra vertical, dins de dobles claudàtors:
"\[\[[^|]+?\|[^\]]+?\]\]"
  • Volem emmagatzemar un text dins de dobles claudàtors, què pot estar separat per una barra vertical i en este cas, només emmagatzemem el primer element:
"\[\[([^|]+?)(?:\|[^\]]+?)??\]\]"
  • Volem emmagatzemar un text dins de dobles claudàtors, què pot estar separat per una barra vertical i en este cas, només emmagatzemem el primer element, el qual no conté els dos punts (":"):
"\[\[([^|:]+?)(?:\|[^\]]+?)??\]\]"

En el següent exemple:

m = re.search("(a)(?:b)", "abolir")

es trobarà "ab" i només s'emagatzemarà "a"

Els grups de l'objecte regexp obtingut seran:

  1. m.group(0) #la subcadena on s'ha trobat el patró, és a dir, "ab"
  2. m.group(1) #el primer grup, és a dir, "a"
  3. m.group(2) #ens dóna error ja que "b", no ha estat emmagatzemat .(?:expressió) trobarà una coincidència, però no l'emmagatzema.

Comproveu-ho amb el següent codi:

import re
txt = "Josefa la 'Cantaira'"
m = re.search("jo([^ ]*)(?:a)", txt, re.I)
print "m.group(0):", m.group(0)
print "m.group(1):", m.group(1)

–Pasqual · discussió · xat 19:04, 21 nov 2009 (CET)

Enllaços interlingüístics

Els objectes Page tenen un atribut, el qual varem vore al taller, per extraure els interwikis.

Podem obtindre les intewikis i fer un bucle fins que ens trobem amb l'interwiki que ens interesse. Una altra manera possible és obtindre l'enllaç interlingüístic mitjançant una regexp. En este cas com que cerquem únicament una llengua determinada la regexp serà molt simple:

re.compile("\[\[ca:([^\]]+?)\]\]")

–Pasqual · discussió · xat 19:24, 21 nov 2009 (CET)

Càrrega de contingut de pàgines

Un mètode de l'objecte Page que no varem vore és .exists(), este ens permet saber si la pàgina existeix, el valor que ens retorna és un boolean, True si existeix o False, si no.

Com a curiositat, a l'alternativa de:

site = wikipedia.getSite()
page = wikipedia.Page( site, u"Títol inexistent" )
try:
   text = page.get( get_redirect = True )
except wikipedia.NoPage:
   text = ""

podríem fer així:

if page.exists():
   text = page.get( get_redirect = True )
else:
   text = ""

i per reduir esta instrucció a una sola línia podem emprar un operador condicional per fer el següent:

text = page.get( get_redirect = True ) if page.exists() else ""

–Pasqual · discussió · xat 19:40, 21 nov 2009 (CET)

getSite()

La funció getSite() del mòdul de wikipedia.py pot anar sense arguments quan es tracte de l'idioma i el projecte per defecte, és a dir, el que tenim definit al nostre user-config.py amb les variables lang i family respectivament.

Ara suposem que tenim per definit lang = "ca" i fam = "wikipedia". Si el que volem és passar-no a una altra llegua, només caldrà especificar esta, per exemple, wikipedia.getSite("en"). Si únicament volem canviar de família, aleshores podríem escriure wikpedia.getSite(fam="wikibooks"), encara que se sol vore més wikipedia.getSite("ca", "wikibooks").

Cal remarcar que esta funció té l'ordre invertit a les variables que trobem al nostre user-config.py, compareu

usernames['wikipedia']['ca'] = "Pasqual"

i

wikipedia.getSite(code="ca", fam="wikipedia", user="Pasqual")

–Pasqual · discussió · xat 20:09, 21 nov 2009 (CET)

text i text_nou

Primer que res, hi ha un convenció en Python (que no se sol respectar, però almenys s'ha de saber).

Hi ha dues nomenclatures per a escriure noms de variables
  1. Si es tracta d'una classe, s'escriu cada amb majúscula inicial, per exemple: ClasseExempleNumero1
  2. per a la resta, minúscules i separades per un guió baix ("_"), per exemple: variable_dinamica o funcio_simple()

Quant a l'error que s'ha comés a l'script, recordem l'estructura (amb un exemple):

text = u"Toni va caure en un pou, però no es va fer mal"
nou_text = text
llista = ["es va", "va caure", "fer mal", "pou", "en un", "  ,"]
dict = {"  ,": ",", "va caure": "es va gitar", "pou": "", "en un": "", "es va": "va", "fer mal": "aconseguir adormir-se"}
for expr in llista:
   nou_text = text.replace(expr, dict[expr])
print "text:", text
print "text:", nou_text

En este exemple el resultat de nou_txt no serà el esperat, ja que anem modificat segons el contingut de la variable text, que no canvia de valor.

text = u"Toni va caure en un pou, però no es va fer mal"
nou_text = text
llista = ["es va", "va caure", "fer mal", "pou", "en un", "  ,"]
dict = {"  ,": ",", "va caure": "es va gitar", "pou": "", "en un": "", "es va": "va", "fer mal": "aconseguir adormir-se"}
for expr in llista:
   nou_text = nou_text.replace(expr, dict[expr])
print "text:", text
print "nou_text:", nou_text

Ara sí que obtindrem el resultat esperat. Ja que a cada expressió es va canviant la valor de nou_text.

–Pasqual · discussió · xat 21:27, 21 nov 2009 (CET)

wikipedia.stopme()

Aquesta funció ens permet alliberar el servidor del nostre bot, que en cas que en tinguem diversos en marxa, suposa que estos podran actuar més ràpidament. És important acabar els nostres bots amb esta funció.

–Pasqual · discussió · xat 21:32, 21 nov 2009 (CET)

Torna a la pàgina de projecte "Viquitrobada 2009/Taller de bots/Bot que tradueix enllaços interns/Arxiu 1".