Hola, estic intentant fer un bot que afegeixi enllaços interns a un article (per Viquidites) i ja el tinc fet. L'únic que em falta és dir-li que revisi totes les pàgines. He estat remenant una mica i he vist que hi ha un mòdul anomenat pagegenerators. He trobat la funció per extreure les pàgina d'una categoria en concret, però no he vist que es puguin llistar totes les pàgines d'un espai de noms en concret. Algú podria donar-me un cop de mà?
Tema de Viquipèdia:La taverna/Tecnicismes
Parlo de memòria sense tenir tots els programes davant.
Abans tant el mòdul wikipedia com el pagegenerators tenien una funció (o un mètode) AllPages però fa temps que van deixar de funcionar, no sé perquè, i no sé si amb core encara existeixen. Els darrers cops que he necessitat totes les pàgines (o totes les categories) he fet servir directament l'API. A Usuari:PereBot/robot categories petites en tens una mostra amb l'API i més avall una mostra amb AllPages que ja no funciona. Aquests programes busquen totes les categories, però demanar fer totes les pàgines ha de ser molt semblant.
Per fer servir l'API tens la documentació a https://ca.wikipedia.org/w/api.php? i a més tens mw:API:Main_page.
En general l'API m'ha anat bé quan l'he feta servir per llegir la Viquipèdia (per escriure no ho he provat mai) i de vegades és més estable que el pywikibot, però alguns cops m'he trobat amb problemes de codificar cadenes unicode en construir noves url a partir del resultat d'una consulta anterior (cal per donar-li un paràmetre continue si la consulta és llarga).
pagegenerators.AllpagesPageGenerator:
def AllpagesPageGenerator(start='!', namespace=0, includeredirects=True,
site=None, step=None, total=None, content=False):
"""
Iterate Page objects for all titles in a single namespace.
"""
L'AllpagesPageGenerator em donava error, però he aconseguit fer servir l'API. Ara em falta solucionar un altre error que no havia vist abans, però moltes gràcies als dos!
Sí, no sé perquè falla. Fa mesos que no em va (ni amb pagegenerators ni amb page), però ja veig que no és a mi sol.
Què és el que falla? No el feia servir, però acabo de provar:
import pywikibot
from pywikibot import pagegenerators
allpages = pagegenerators.AllpagesPageGenerator(site=pywikibot.Site("ca", "wiktionary"), start="!", namespace=0, includeredirects = True)
pages = pagegenerators.PreloadingGenerator(allpages, pageNumber = 100)
for page in pages:
text = page.text
page.put(text, "Null edit")
Tens raó. Ara em funciona la mateixa instrucció que no em funcionava. Millor així.
Ah, ara també em funciona a mi. Abans no utilitzava el PreloadingGenerator, suposo que era això.
Corregeixo: el pagegenerator ara no funciona. És com si a vegades funcionés però a vegades no. L'error concret és:
Retrieving 100 pages from wikiquote:ca. Traceback (most recent call last): File "/home/ubuntu/workspace/core/enllacos.py", line 25, in <module> main(page) File "/home/ubuntu/workspace/core/enllacos.py", line 14, in main page = pwb.Page(site, pag) File "/home/ubuntu/workspace/core/pywikibot/tools/__init__.py", line 1327, in wrapper return obj(*__args, **__kw) File "/home/ubuntu/workspace/core/pywikibot/tools/__init__.py", line 1327, in wrapper return obj(*__args, **__kw) File "/home/ubuntu/workspace/core/pywikibot/page.py", line 2030, in __init__ super(Page, self).__init__(source, title, ns) File "/home/ubuntu/workspace/core/pywikibot/page.py", line 126, in __init__ self._link = Link(title, source=source, defaultNamespace=ns) File "/home/ubuntu/workspace/core/pywikibot/page.py", line 4724, in __init__ if u"|" in self._text: TypeError: argument of type 'Page' is not iterable <type 'exceptions.TypeError'> CRITICAL: Closing network session.
Tens el codi? Aquest error sembla el que passa quan un es confon de variables i acaba volent iterat (en un for) una variable que no conté una llista o un generador sinó un sol objecte pàgina.
Sí, l'he posat a http://pastebin.com/11FBrSsh.
El resultat del pageGenerator ja és un objecte. Amb page = pwb.Page(site, pag) estàs intentant crear un objecte d'un objecte, per això l'error d'iteració. Pots fer directament text = pag.text i eliminar la variable.
Val, ja ho entenc. Ho tindré present, gràcies per l'ajuda!