Vés al contingut

Tema de Viquipèdia:La taverna/Tecnicismes

Problemes amb el pagegenerator (pywikibot)

13
Darrera edició del resum per Pere prlpz 15:51, 23 des 2015 fa 8 anys

Dubte resolt

Unapersona (discussiócontribucions)

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à?

Pere prlpz (discussiócontribucions)

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

Vriullop (discussiócontribucions)

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.

    """
Unapersona (discussiócontribucions)

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!

Pere prlpz (discussiócontribucions)

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.

Vriullop (discussiócontribucions)

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")
Pere prlpz (discussiócontribucions)

Tens raó. Ara em funciona la mateixa instrucció que no em funcionava. Millor així.

Unapersona (discussiócontribucions)

Ah, ara també em funciona a mi. Abans no utilitzava el PreloadingGenerator, suposo que era això.

Unapersona (discussiócontribucions)

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.
Pere prlpz (discussiócontribucions)

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.

Unapersona (discussiócontribucions)
Vriullop (discussiócontribucions)

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.

Unapersona (discussiócontribucions)

Val, ja ho entenc. Ho tindré present, gràcies per l'ajuda!