Vés al contingut

Viquiprojecte:Bots/Dubtes

De la Viquipèdia, l'enciclopèdia lliure
Benvinguts a la pàgina de resolució de dubtes del Viquiprojecte dels Bots. Si teniu algun dubte sobre algun programa que esteu desenvolupant, afegiu una secció.
Col·laboradors del viquiprojecte: afegiu aquesta pàgina a la vostra llista de seguiment, així podreu adonar-vos més ràpid de nous dubtes i intentar resoldre'ls.

eliminació de corxeres[modifica]

Estic enfrascat intentant eliminar les corxeres automàticament. Demano ajuda aquí, per no atabalar més en Joan Creus (disculpa). L'¡origen és la traducció del francès i l'encaix amb la plantilla en català. Arribo a l'expressió
|direcció = [[Noms Cognoms]] i es tracta de substituir-ho per
|direcció = Noms Cognoms. Suposo que no trobo la maleïda i exacta expressió regular. En l'ordre re.sub ho he provat gairebé tot, per exemple
re.sub(ur'\| direcció \= \[\[(.*)\]\]',...També substituint 'ur' per 'r', els espais per punts, etc. Agrairé idees, --Pallares (disc.) 17:58, 22 set 2010 (CEST)

A la instrucció que escrius hi veig dos problemes: 1) l'espai entre "|" i "direcció" 2)el ".*"
Si no et funciona segurament és per l'espai que fan que no encaixi amb cap subcadena del text, els espais conten i només encaixaria si hi hagués | direcció = [[Noms Cognoms]] (mira també els espais entre l'= i [)
El segon problema és que el * és "golafre" intenta menjar-se tants caràcters com pot i anirà a buscar els dos ] seguits més llunyans que pugui del text.
Solucions: 1) re.sub(ur'\| *?direcció *?= *?\[\[(.*?)\]\]',... El "?" a la dreta del * fa que no sigui golafre que agafi el mínim de caràcters possible. Ho he posat també als espais per prevenir que algú no n'hagi posat cap o més d'un.
2) re.sub(ur'(?<=\|direcció = )\[\[([^\]]*\]\]',...
En la segona proposta fixat que es fa servir un grup (?<= ... ) aquest grup no captura text i serveix perquè només encaixin les subcadenes precedides per la que hi ha després del "=", llavors agafa la cadena més llarga que pugui formada per caràcters diferents de ] i despres dos ]. Aquesta només funciona si no hi ha cap espai entre el | i "direcció" i exactament un espai abans i despres del "=".
exemple:
print re.sub(ur'\| *?direcció *?= *?\[\[(.*?)\]\]',ur'|direcció = \1',u"{{text anterior|direcció = [[La direcció que jo dic]]| text posterior}}")
print re.sub(ur'(?<=\|direcció = )\[\[([^\]]*)\]\]',r'\1',u"{{text anterior|direcció = [[La direcció que jo dic]]| text posterior}}")
--Gomà (disc.) 09:12, 24 set 2010 (CEST)
Després d'unes quantes proves més, el problema estava en la segona part de l'ordre:
print re.sub(ur'\| *?direcció *?= *?\[\[(.*?)\]\]',ur'|direcció = \1',u"{{text anterior|direcció = [[La direcció que jo dic]]| text posterior}}")
. Per què 'ur' i no 'r' ? Quin significat té cadascun d'aquests modificadors?--Pallares (disc.) 19:39, 24 set 2010 (CEST)

Canvis condicionats[modifica]

Suposem un article com: {{fitxa de pel·lícula |gènere = comèdia }} '''''Celebrity''''' és una [[pel·lícula]] dirigida per [[Woody Allen]], estrenada el [[1998]]. [[Categoria:Pel·lícules dels Estats Units]]

Es possible afegir la categoria: Pel·lícules de comèdia ( de qualsevol altre dada qua vagi després de gènere =)

Es possible afegir "del 1988" o qualsevol altra any a "Pel·lícules dels Estats Units" Molt agraït,--Pallares (disc.) 10:22, 29 set 2010 (CEST)

Resposta[modifica]

Reinterpreto la pregunta: Fer un programa que cerqui el gènere de la pel·licula i al darrere de la categoria "Pel·licules dels Estats Units" afegeixi la categoria Pel·licules de "gènere". Compte que no funcionarà per pel·licules d'altres països:

cerca = re.copile(u'(?<=\|gènere *= *)([^\|\}]*)(.*)(\[\[Categoria:Pel·lícules dels Estats Units\]\])')

textnou = cerca.sub(ur'\1\2\3\n\n[[Categoria: Pel·lícules de \1]]',text)

Fixat que a l'expressió regular hi ha tres grups: (tres cadenes tancades entre parèntesi que capturen text, el primer (?<= no conta perquè no captura text). El primer grup captura el gènere de la pel·lícula, el segon tot el text de l'article entre el gènere i la categoria i el tercer la categoria.

Llavors la substitució, substitueix tot això per un altre text format pels tres grups, per tant no canvia res a la pràctica, però després s'afegeix la cadena "\n\n[[Categoria: Pel·lícules de " seguida d'una còpia del text capturat en el primer grup (el gènere) i seguit de la cadena "]]".

Segurament no sigui la manera més clara de fer-ho si per exemple es vol verificar que la categoria no hi sigui ja per no duplicar, si es vol que funcioni per pel·lícules d'altres països... Es pot fer perquè el primer paràmetre del mètode sub pot ser una cadena o una funció, si és una funció se li passen els grups capturats i el que retorni la funció serà el que s'inserirà en substitució. Però pot ser més clar escriure un programa que cerqui el text de després de "|gènere = " miri si ja hi ha o no la categoria i en cas que no hi sigui afegeixi al final de l'article la categoria nova.

Nota: ho he escrit tot de memòria sense provar-ho si no funciona i no ten surts m'ho dius i ho revisaré.

--Gomà (disc.) 12:39, 29 set 2010 (CEST)

Resposta nº 2[modifica]

(aquesta l'he comprovat amb el Celebrity de veritat i funciona... a veure tu) El codi és aquest, ara no tinc temps d'explicar-te'l. Quan pugui ho faré:

# -*- coding: utf-8 -*-
import wikipedia,re,catlib

page = wikipedia.Page(wikipedia.getSite('ca'),'Celebrity')
txt = page.get()
#txt = txt.replace(u'[[Categoria:Pel·lícules de comèdia]]\n','')
cats = page.categories()
genere = re.search(ur'\|\s*g.nere\s*=\s*(.*)\s*',txt)
g = genere.group(1)
if not u'Pel·lícules de '+g in txt:
  noutext = re.sub('\[\[[Cc]ategor[ia|y]',u'[[Categoria:Pel·lícules de '+g+']]\n[[Categoria:',txt,1)
  print noutext
  # aquí hauries de fer un put AMB EL NOUTEXT
else: print u'ja està col·locat'

--Joancreus (discussió) 14:40, 29 set 2010 (CEST)

reformulació de la pregunta[modifica]

Segurament no he afinat prou en la pregunta. Abans de tot agrair-vos les vostres respostes, aquestes i anteriors han permès que els bots deixin els articles gairebé com en els dos exemples que us poso a continuació (hi ha una feina obligada de lectura de la traducció i sempre hi ha detalls, que els francesos no són gaire ordenats).

Arribem als articles Blade i Black Dawn. Tenen una categoria a revisar (Pel·lícules dels Estats Units) on pràcticament només hi han aquests articles, que ens servirà. Voldria que en tots els articles d'aquesta categoria es fes l'afegit que us demanava ahir. Es a dir, anés als articles, llegís que hi ha després de gènere =, i afegís la categoria corresponent. Respectivament, "Thrillers" i "pel·lícules d'acció". Gràcies de nou.--Pallares (disc.) 10:17, 30 set 2010 (CEST)

Resposta[modifica]

# -*- coding: utf-8 -*-
import wikipedia,re,catlib

def cats(page):
  prou = False
  if page.title().startswith('Usuari:Pallares'): prou = True
  txt = page.get()
  print txt
  txt = txt.replace(u'[[Categoria:Pel·lícules de comèdia]]\n','')
  cats = page.categories()
  genere = re.search(ur'\|\s*g.nere\s*=\s*(.*)\s*',txt)
  try: g = genere.group(1)
  except AttributeError:
     prou = True
     g = str()
  if not u'Pel·lícules de '+g in txt and prou == False:
    if g.lower() == u'comèdia': noutext = re.sub('\[\[[Cc]ategor[ia|y]',u'[[Categoria:Pel·lícules de '+g.lower()+']]\n[[Categoria:',txt,1)
    elif g.lower() == u'acció': noutext = re.sub('\[\[[Cc]ategor[ia|y]',u'[[Categoria:Pel·lícules d\''+g.lower()+']]\n[[Categoria:',txt,1)
    elif g.lower() == u'thriller': noutext = re.sub('\[\[[Cc]ategor[ia|y]',u'[[Categoria:Thrillers]]\n[[Categoria:',txt,1)
    else: print u'no reconec el gènere '+g
    print noutext
    # aquí hauries de fer un put AMB EL NOUTEXT
  else: print u'ja està col·locat/error'

cat = catlib.Category(wikipedia.getSite('ca'),u'Pel·lícules dels Estats Units').articlesList()
for p in cat:
    cats(p)

Aquí ho tens. Almenys a mi em funciona, però hi ha ben pocs articles a la categoria. El .startswith('Usuari:Pallares') és perquè ignori el teu laboratori (sinó peta). --Joancreus (discussió) 14:32, 30 set 2010 (CEST)

Ok, funciona, només un problema: afegeix a la categoria existent ':a'.Mira't la història de Black Dawn o Blade.