Utente:Alex brollo/Note pywikipedia

Da Wikisource.
Jump to navigation Jump to search

generalità sui moduli[modifica]

  • caso senza parametri

Sono azioni equivalenti:

  1. c:\>python modulo.py
  2. c:\>python e poi: >>> import modulo
  3. entrare in IDLE e poi: import modulo
  • caso con parametri

Come passarli nei casi 2 e 3? Chiedere a Qualc1 o PietroDn.

In tutti questi casi l'importazione causa la compilazione delle funzioni e classi del modulo, che diventano richiamabili come modulo.script() o modulo.attributo. Se fuori delle def c'è codice, viene lanciato al caricamento.

Tips:

  1. aggiungere in prima riga #!/usr/bin/python per attivarne l'esecuzione semplificata sotto Linux;
  2. aggiornata la variabile __version__ = '0.1' a ogni nuova versione.
  3. unificare con Ale.py su ekopedia. :-(


Tips & tricks with pywikipedia[modifica]

Clicca qui per aggiungere una sezione


Bot multiprogetto[modifica]

Un singolo bot può essere loggato in più progetti e in più famiglie. I vari account vanno registrato su un unico file user-config e se la password è identica si può fare un login di massa una tantum.

Gli script devono contenere un parametro opzionale per indicare dove un'eventuale azione va attuata (opportuno porre per default il sito più utilizzato)

wikipedia.py[modifica]

Il cuore di wikipedia.py è la classe Page. L'oggetto derivato ha una lunghissima serie di metodi e di attributi/campi. Molti script restituiscono generatori di oggetti Page.

Categorie[modifica]

Le categorie non sono pagine, ma verosimilmente qualcosa come query a file indice. Non ce n'è traccia nel dump. Sono gestibili attraverso due moduli:

  • catlib.py, per interrogare al volo il server sul contenuto delle categorie, con la possibilità di andare "in alto" (supercategories) e "in basso" (subcategories) ed estrarre elenchi di contenuti;
  • category.py, per esegure altre operazioni; il "cuore" è il meccanismo di dumping locale dell'intero albero delle categorie, che poi possono essere interrogate con estrema rapidità. Il caricamento dell'albero può essere laborioso (una lettura per ogni categoria).

Usi[modifica]

Dump xml[modifica]

Un dump xml può essere:

  • per gruppo di pagine, con la funzione Esporta
  • globale, scaricabile nel repository, come file xml compresso .bz2

Le funzioni di parsing/estrazione funzionano indifferentemente su entrambi.

Il modulo base è xmlreader.py, che si fonda sulle funzioni SAX di python. Il metodo .parse() genera oggetti-pagina ciascuno dei quali è un elemento di <page>...</page>; es. oggetto.text è il testo della pagina, oggetto.title il titolo, ecc.

Usi[modifica]

Viene usato nel modulo in studio Ale.py su ekopedia; al momento, è in grado di restituire un dizionario in cui le voci sono i namespace: la key è il nome locale del namespace, il value è la lista di tutte le pagine del namespace tipo: [[titolo,testo], .....]. La key per il ns0 è "Main" per tutti i progetti.

Alternativa con find_stringa[modifica]

Fatta la comparazione con xmlreader, il vecchio sistema index_xml() basato su find_stringa() si difende bene. Esegue il parsing di tutto il dump di source (300Mby) in 30 secondi, 10 Mby/secondo (mentre xmlreader impiega 10 secondi per un xml da 20Mby, 2 Mby/secondo) e genera liste di puntatori alle singole pagine: [offset, lunghezza, titolo, ns]. Svantaggio: i titoli non sono indicizzati, quindi l'algoritmo per ripescare un elemento page richiede la creazione di una seconda lista, esattamente nello stesso ordine, da interrogare con il metodo lista lista.index(titolo); il risultato punta l'elemento della prima lista che può essere usato da leggi_pagina_xml(indice nella lista).

table2wiki[modifica]

Modulo molto interessante perchè interroga il dump xml per trovare le pagine che contengono probabilmente una tabella attiva, mediante ricerca di <table. Da consultare per tale meccanismo. Per il resto, la conversione html-wiki del codice tabelle è quantomai inutile (trasforma un codice "well formed" in uno "malformed" ;-) ), tuttavia piace.

La classe wikipedia.Site()[modifica]

Tutta da esplorare, ma innanzitutto utilissimo il suo metodo getUrl(titolo pagina) che restituisce il codice della pagina, com'è servito dal server (prima che javascritp agisca modificandolo). La pagina è restituita come testo Unicode.