Wikipédia:Pywikibot/replace.py

A Wikipédiából, a szabad enciklopédiából
A replace.py képernyője az i/í betűk helyesírását javító fix futtatása közben. A „Részösszeg a képernyőre” kezdetű sor nem része a programnak, Bináris kiegészítése saját használatra. Sárgával a közvetlenül meg nem jeleníthető jelek helyettesítői, pirossal a cserélendő rész, zölddel a felajánlott javítás látható

A replace.py a Pywikibot szkriptgyűjtemény egyik modulja.

Ez a program szövegcserét végez. A módosítandó lapok listáját vagy egy xml-állomány (jellemzően a dump) vagy egy szöveges fájl (.txt) vagy egy wikioldal (pl. szerkesztői allap) tartalmazza, de végezhető egyetlen lapon is módosítás. További információ érhető el a help paraméter segítségével:

python replace.py -help

(Windowsban a python elhagyható.)

Áttekintés[szerkesztés]

A programot alapvetően kétféleképpen használhatjuk:

  1. Minden paramétert a parancssorban adunk meg, beleértve a cserélendő szövegeket is. Ez egyszerűbb esetben ajánlott. Pl. a
    replace.py -ns:0 egyenlőre egyelőre -search:egyenlőre
    parancs a szócikknévtérben (ns:0, ld. Wikipédia:Névtér) az „egyenlőre” szóra végzett keresés alapján (ez ugyanaz, mintha a keresőbe írnánk be a szót) javítja a kis e-vel kezdődő egyenlőre szavakat, mindegyik csere előtt rákérdez (figyeljünk oda, mert van, ahol tényleg az n-es változatot kell meghagyni!), és az alapértelmezett szerkesztési összefoglalót írja a javításhoz. (Ez a parancs szinte legegyszerűbb használható alakja, lásd ennek a szakasznak a végén a minimális paraméterkészletet.)
    Ha a cserélendő vagy az új szöveg szóközt tartalmaz, használj idézőjelet!
    A gyakran használt parancsokat Windowsban kötegelt állományban (batch file), Linuxban shell scriptben tárolhatjuk.
  2. A főbb paramétereket, mindenekelőtt a cserélendő és az új szöveget és a kivételeket, valamint a szerkesztési összefoglalót egy állományban tároljuk. Ez lehet a fixes.py, amely már rendelkezésünkre áll, és minta szerint folytathatjuk; a mentésről viszont fontos gondoskodni, mert a következő frissítéskor felülíródik a „gyárival”! Vagy lehet a user-fixes.py, amit pont erre terveztek, és a benne levő minta alapján tölthető ki. Ez a file nem része a Pywikipedia-disztribúciónak, hanem a generate_user_files.py script futtatásával hozható létre. Ezek az állományok számos ún. fixet tartalmazhatnak; egy fix egy cserélési feladatot ír le, és ha egyszer már megírtad, bármikor újra futtatható. Néhány fixre (a fixes.py szintaxisa szerinti stílusban) a Szerkesztő:BinBot/munka/helyes lap alján linkelt allapokon láthatunk példát. Ha használjuk a fixes.py-t, akkor is megadhatunk néhány további paramétert a parancssorban, másokat viszont a fixben tárolt érték felülírhat, hiába írjuk a parancssorba. Ez a második módszer általában véve sokkal hatékonyabb, ütőképesebb és rugalmasabb, bár több előkészületet igényel.

Más szempontból is kétféle stratégiát követhetünk, az előző választástól függetlenül:

  1. Egyszerű szövegcserét végezhetünk reguláris kifejezések nélkül is, ami konkrét szavak, sablon- és kategórianevek, fejezetcímek, angolosan átírt orosz focisták stb. esetén jó, de már a ragozott alakokat nem találja meg! Például az egyenlőre helyett egyelőre így is menni fog, de már a kis- és nagybetűs alakot nem tudjuk együtt kezelni. (Megadhatjuk egymás után mind a kettőt a parancssorban, mert lehet több régi→új pár is.)
  2. Reguláris kifejezéseket használunk, amelyek bizonyos mintákat keresnek, és más mintával helyettesítik. Ez már akkor is szükséges lehet, ha egy szó ragozott alakban is előfordulhat.

A követendő stratégiát egy harmadik szempontból is megválaszthatjuk:

  1. A javítandó lapokat az élő wikiben keressük (ez keresés, sablon vagy kategória szerinti munka esetén elfogadható sebességet ad, a lapokon való egyszerű végighaladáskor csak nagyon ritka esetben).
  2. A javítandó lapokat a dumpból vesszük – ekkor nem fogjuk megtalálni azokat a cikkeket, ahova a legutóbbi dump elkészítése óta került bele a cserélendő szöveg, de minta szerinti keresésnél általában sokkal nagyobb sebességet érünk el, és hatékonyabban használhatjuk a gépünk, a szerver és saját magunk idejét is. Bánatunkra ezt kell tennünk akkor is, ha a cserélendő szó különböző ragozott alakokban is előfordulhat, mivel a kereső nem kezeli a reguláris kifejezéseket.
    A legfrissebb dump itt található: http://dumps.wikimedia.org/huwiki/.
    Ha rendszeresen végzel botmunkát, érdemes figyelőlistára venned A dump dátuma sablont, így hamarabb értesülhetsz a frissítésekről.

A negyedik döntésünk így szól:

  1. Keressük a javítandó cikkeket, és röptében javítjuk is. (Ez általában a -search paraméter használatakor vagy a kategória, ill. sablon szerinti munkáknál ad elfogadható sebességet.)
  2. Automatikus üzemmódban (a -save vagy a -savenew paraméterrel) kigyűjtjük a potenciálisan javítandó cikkek címét egy állományba, mialatt mi ebédelünk, alszunk, kirándulunk, járőrözünk vagy szócikket írunk (vigyázat, extrém esetben több ebéd is beleférhet!), és a második menetben javítunk, sokkal kisebb holtidővel.
A minimálisan megadandó paraméterek

Minden futáskor minimálisan a következő paramétereket kell megadnunk:

  1. Honnan vegye a javítandó lapokat?
    Ez lehet pl. a -start, -file, -page, -search, -xml, -cat valamelyike. (Lásd a lenti táblázat Források szakaszát.)
  2. Mit cseréljen és mire?
    Ez egy vagy több stringpár lehet, vagy pedig a fix neve, ahol a cserét részletesen leírtuk.
  3. Bár nem kötelező, de általában érdemes és kezdőknek különösen ajánlott a leszűkítés a szócikknévtérre a -ns:0 paraméterrel (így kerülhető el, hogy pl. a vitalapokon a szerkesztők aláírt hozzászólásait is átjavítsuk). Az olvasók számára látható felület még a sablonok megjelenő része (nem a kód!!!) és a filenévtérben a leírások. Az első időkben kerüld el a szerkesztői lapok, vitalapok és a Wikipédia-névtér szerkesztését, és később is csak különös figyelemmel és a közösség véleményének ismeretében tegyél ilyent. Ne lepődj meg, ha a névteret leíró paraméter elhagyása dühös reakciókat vagy a botod blokkolását váltja ki.

Fájlok[szerkesztés]

A bot – a keretrendszeren felül – 3 fájlt használ:

replace.py
a főmodul,
fixes.py
néhány előredefiniált javítást tartalmaz,
user-fixes.py
saját javításokat tartalmazó fájl; a csaknem üres fájlt a generate_user_files.py hozza létre.

A be-, illetve kimenethez szükséges további fájlok:

filename.txt
a cikkek felsorolását tartalmazó fájl neve (a -file argumentummal használható),
filename.xml
helyi xml-állomány (az -xml argumentummal használható),
replacelog
napló, (a -log paraméterrel használható).

Argumentumok[szerkesztés]

Lokális argumentumok[szerkesztés]

A replace.py az alábbi paraméterekkel rendelkezik:

(Például: python replace.py -file:cikkek_listája.txt "sajtóhuba" "sajtóhiba")

Források
-xml Az xml-állományban megadott lapokkal dolgozik. (pages_current, lásd http://download.wikimedia.org). Az argumentum a -xml:fájl_neve formában is használható.
-xmlstart Az -xml paraméterrel együtt használva megadja annak a cikknek a címét, ahol a keresés kezdődik. A dump általában az első szerkesztés sorrendjében tartalmazza a cikkeket. Ctrl C-vel való megszakításkor a bot kiírja, melyik cikktől folytathatjuk a keresést.
-file A txt-fájlban megadott lapokkal dolgozik. Az argumentum a -file:fájl_neve formában is használható.
-cat A megadott kategóriában szereplő lapokkal dolgozik. Az argumentum a -cat:kategória_neve formában is használható.
-subcat Működése a fentihez hasonló, de a megadott kategórián belül az egyes alkategóriákban szereplő lapokkal is dolgozik.
-transcludes A megadott sablont használó lapokon dolgozik. Az argumentum a "-transcludes:sablon" formában is használható, például a "-transcludes:csonk" a csonkjelzéssel ellátott lapokat jelöli.
-page Csak a megadott lapon végez szerkesztést. Az argumentum a -page:lap_neve formában is használható. Több oldal megadása esetén az argumentumot többször is fel lehet használni.
-ref A megadott lapra hivatkozó lapokkal dolgozik. Az argumentum a "-ref:hivatkozott_lap_neve" formában is használható.
-filelinks A megadott képre hivatkozó lapokkal dolgozik. Az argumentum a "-filelinks:kép_neve" formában is használható.
-links A megadott wikilapon linkelt lapokon dolgozik. Az argumentum a "-links:linkingpagetitle" formában is használható.
-start A megadott laptól kezdve a wiki összes lapján dolgozik. A "-start:!" megadása esetén a legelejétől kezdi. Megjegyzés: Használd inkább a -xml paramétert; ez a lehetőség akkor jó, ha nincs friss dump.
-prefixindex A megadott előtaggal kezdődő című lapokon dolgozik. (Megfelel a Speciális:Keresés előtag szerint listának.)
-titleregex Reguláris kifejezés alapján keresi a módosítandó cikkek címét
(pl. -titleregex:'A.* izotópjai').
Cél
-save Ezzel a paraméterrel a bot a wikin végzett éles szerkesztés helyett egy állományba gyűjti a javítandó cikkek címét. A munkát így két részre lehet bontani: először automatikus futással kigyűjtjük a dumpból az érintett cikkek címét, miközben nem kell a gép mellett ülni (a -always kapcsolóval vagy az első találatnál az a megadásával), majd később a -file paraméterrel újra futtatva gyorsabban végezhetjük el a javításokat. A file tartalmát beilleszthetjük a wikink egy lapjára is, ilyenkor számozott listaként jelenik meg, és a -links paraméterrel dolgozhatjuk fel. Minden századik cím után egy számozott megjegyzést helyez el, hogy könnyebb legyen több részletben végezni a javítást, ha több ezer cikk szerepel a listán. Ha a megadott állomány már létezik, a bot bővíti. A paraméter -save:fileneve alakban is megadható.
-savenew Ugyanúgy működik, mint a -save, csak ha már létezik a megadott állomány, akkor felülírja. A paraméter -savenew:fileneve alakban is megadható.
A helyettesítéssel kapcsolatos paraméterek
-excepttitle:XYZ Az XYZ szöveget tartalmazó című cikkek átugrása. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni. (Példa: az -ít végű igék javításakor kihagyhatjuk azokat a cikkeket, amelyeknek a címében szerepel „a jogalkotásban” szöveg – sok hamis találattól kímélhetjük meg magunkat a régies, 19. századi helyesírású törvénycímek kizárásával.)
-excepttext:XYZ Az XYZ szöveget tartalmazó cikkek átugrása. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni.
-exceptinside:XYZ A helyettesítendő szöveg figyelmen kívül hagyása az XYZ szövegen belül. Amennyiben a -regex argumentumot megadjuk, az XYZ-t mint reguláris kifejezést fogja figyelembe venni.
-exceptinsidetag:XYZ A helyettesítendő szöveg figyelmen kívül hagyása az XYZ tagen belül.
-summary:XYZ Megadható az összefoglaló szövege. Felülírja az alapértelmezett értéket („Robot: Automatikus szövegcsere …”).
-fix:XYZ Előre definiált szövegcserék végrehajtása. A cseréket a fixes.py vagy a user-fixes.py állományban adhatjuk meg a 'fixes' szótár elemeként. A parancssorban megadott cseréket, a -summary, -regex és a kivételekkel kapcsolatos opciókat a bot figyelmen kívül hagyja, és magából a fixből veszi.

A letöltött változatban készen használható fixek:

  • HTML - wikikódra cseréli a HTML-tageket, és javítja az XHTML-t.
  • syntax - megpróbálja kijavítani a hibás wikikódokat.

További fixekre láthatsz példákat a Szerkesztő:BinBot/munka/helyes lapon.

-namespace:n

rövidítés: -ns:n

A feldolgozandó névtér sorszáma. Ezt a paramétert többször is használhatod. Az összes többi paraméterrel együttműködik, kivéve a -start paramétert. (Ha egy adott névtérben akarsz dolgozni megadott címtől kezdve, akkor írd ki a névteret, pl. -start:User:!.)
névtelen Az első névtelen argumentum a régi szöveg, míg a második az új szöveg. Amennyiben a -regex argumentumot megadjuk, az első névtelen argumentumban megadott szöveget mint reguláris kifejezést fogja figyelembe venni, a második névtelen argumentum pedig tartalmazhat \\1 vagy \g<name> alakú kifejezéseket. Több ilyen párt is megadhatunk. Az összes elgépelt, fel nem ismert paramétert is cserélendő szövegként próbálja értelmezni a bot. Ha ezek száma páratlan, akkor a pywikibot.exceptions.Error: require even number of replacements. hibaüzenetet kapjuk.
Opciók
-always Nem kér megerősítést a cserékhez, automatikusan fut. Veszélyes paraméter, csak akkor használd, ha teljesen biztos vagy benne, hogy jól működik! A -save/-savenew paraméterrel azonban veszélytelenül használható, mivel a bot ilyenkor nem végez szerkesztést a wikin.
-recursive Rekurzív cserét végez.
-nocase A reguláris kifejezésekben nem tesz különbséget kis- és nagybetű között.
-allowoverlap Ha a minta előfordulásai átfedik egymást, mindet cseréli. Fontos! Ne használd, ha nem vagy biztos abban, hogy mit csinálsz, mert ez könnyen végtelen ciklushoz vezethet.
-regex A szövegrészeket reguláris kifejezésként fogja kezelni. Ha ez az argumentum nincs megadva, a program egyszerű szövegcserét fog végezni.
-dotall A pont karakter a sorvégekre is illeszkedik a reguláris kifejezésekben.

Az insidetag kivétel lehetséges értékei[szerkesztés]

Az insidetag kivétel lehetséges értékei a textlib.py-ban vannak definiálva. Ezek a következők:

  • Első csoport: egyedi tagek
    • 'comment': HTML-comment
    • 'header': szakaszcímek, akárhány =-lel
    • 'pre':
    • 'source': a syntaxhighlight taget is kezeli
    • 'ref':
    • 'startspace': szóközzel kezdődő sorok
    • 'table': táblázat (az egymásba ágyazott táblázatokat nem kezeli)
    • 'template': sablon (még nem tökéletes a működése)
    • 'hyperlink': külső link
    • 'gallery':
    • 'link': belső hivatkozás, interwiki, kategória, kép
    • 'interwiki': normál iw-link + más wikire való belső hivatkozás ([[:en:article]]...)
  • Második csoport: HTML-szerű páros tagek
    nowiki, noinclude, includeonly, timeline, math stb.

Globális argumentumok[szerkesztés]

Használható még a -help, a -lang, a -family, a -log, a -nolog és a -putthrottle paraméter.

Mintapéldák[szerkesztés]

Az alábbi utasítással lehet a sablonok régi, {{msg:Csonk}} alakú formátumát az új, {{Csonk}} alakúra változtatni. Előtte a http://download.wikimedia.org oldalról töltsd le a szükséges XML-fájlt (dump).

   python replace.py -xml -regex "{{msg:(.*?)}}" "{{\1}}"

A szövegcsere több soros szöveg esetén is elvégezhető:

   python replace.py -regex -start:! "Első sor\nMásodik sor" ""

A replace.py segítségével hozzáfűzhetünk vagy beszúrhatunk szövegeket a lapra (a beszúrt szöveget új sorba írjuk):

   python replace.py -regex '(?ms)^(.*)$' "\1
    > [[Kategória:Új kategória]]"

Amennyiben az XML-fájl a foobar.xml nevet viseli, a kívánt szövegcsere így végezhető el:

   python replace.py -xml:foobar.xml "Sajtóhuba" "Sajtóhiba"

Ha a Gipsz Jakab cikkben szeretnéd a HTML-cimkéket a wiki jelölőnyelv elemeire cserélni:

   python replace.py -page:Gipsz_Jakab -fix:HTML

A program argumentumok nélküli futtatásával egyszerre több szövegcsere is elvégezhető:

   python replace.py -file:blah.txt

A szkript ekkor a felhasználótól külön bekéri a szükséges szövegrészeket. Célszerű az eredményt ellenőrizni, érdemes meggyőződni arról, hogy nem vétettünk hibát a szöveg begépelésénél. Az egyes cikkeket meg lehet adni egy wikilinkeket tartalmazó, külső txt-fájlban is:

 [[répa]]
 [[retek]]
 [[mogyoró]]

A botot ekkor valami efféle paranccsal indíthatjuk el:

 python replace.py <globális argumentumok> -file:cikkek_listája.txt "Sajtóhuba" "Sajtóhiba" 

A reguláris kifejezéseket a parancssor helyett a user-fixes.py fájlhoz is hozzáadhatjuk:

 python replace.py -file:cikkek_listája.txt -fix:example2

Példa: több bekezdés cseréje[szerkesztés]

Tegyük fel, hogy a Homokozóban a következő áll:

Itt bátran tesztelhetsz.

Üdvözlünk a Homokozóban!

Ha a két mondatot szeretnéd felcserélni (a másodikat az első elé tenni), használd a következő utasítást:

replace.py -page:Wikipédia:Homokozó -regex "Itt bátran tesztelhetsz.\r\n\r\nÜdvözlünk a Homokozóban!" "Üdvözlünk a Homokozóban!\n\nItt bátran tesztelhetsz."

Új sor hozzáadásához használható: \n

Példa: cikkek kigyűjtése[szerkesztés]

A -save kapcsolóval álcseréket is végezhetünk, ami lehetővé teszi valamilyen szöveget tartalmazó vagy nem tartalmazó cikkek kigyűjtését egy állományba. A Wikipédia:Botgazdák üzenőfala/Archív 14#Veszélyeztetett fajok listázása, átalakítás, adatgyűjtés szakaszban foglalt feladat megoldása az alábbi parancsokkal történt (az eredmény a Wikipédia:Állatok műhelye/Redlist laptörténetében látható, amíg ki nem törli valaki):

1. Azon cikkek kigyűjtése az Állatfajok kategóriából és alkategóriáiból, amelyek tartalmazzák az „iucnredlist.org” stringet, de nem tartalmazzák a redlist sablont:

replace.py -catr:"Állatfajok" iucnredlist.org b -excepttext:"{{redlist" -save:redlist.txt

A parancs a keresett iucnredlist.org szöveget cserélné le egy b betűre, de nem végzi el a cserét (szép kis vandalizmus is volna!), csak kigyűjti az érintett cikkeket a redlist.txt-be.

2. Azon cikkek kigyűjtése az Állatfajok kategóriából és alkategóriáiból, amelyek nem tartalmazzák sem az „iucnredlist.org” stringet, sem a redlist sablont:

replace.py -catr:"Állatfajok" e b -excepttext:iucnredlist.org -excepttext:"{{redlist" -save:redlist.txt

Ez esetben mindkét szöveget a kivételek közé írjuk, de akkor mit keressünk? Mondjuk az e-t, a magyar ábécé leggyakoribb magánhangzóját. Nem nagy kockázat kihagyni az e betűt nem tartalmazó cikkeket, ugye? :-) Észrevétel érkezett, hogy a gyűjtésbe olyan cikkek is bekerültek, amelyekben nagybetűs {{Redlist}}(?) sablon van; ezt vagy egy újabb kivétellel vagy reguláris kifejezések használatával lehetett volna elkerülni.

Példa: rengeteg vastagítás eltüntetése egy szócikkből[szerkesztés]

A Grace klinika epizódjainak listája cikkben több nagy táblázatban rengeteg feleslegesen vastagított epizódcím volt; ezeket célszerű volt bottal eltüntetni. Ilyen esetekben egyetlen cikkhez is érdemes botot használni (de van alternatíva is).

Mit keresünk?
  • ''' párok közé zárt szövegeket,
  • amelyek táblázaton belül vannak (a cikk többi részében nem kell cserélni),
  • de nem tartalmaznak | jelet (ez biztonsági megerősítés, hogy cellán belül maradjunk – talán nem is lenne muszáj),
  • figyelve rá, hogy több is van egy táblázaton belül, tehát rekurzívan keresünk,
  • és hogy a táblázatok több sorba vannak tördelve (dotall),
  • és hogy minden táblázat nyitókódjához a saját zárókódja és minden nyitó vastagítójelhez a saját párja tartozzék (ezért vannak a mohóságot tiltó kérdőjelek).
Mire cseréljük?

A vastagítások előtti, közötti és utáni részre; ezeket előre kerek zárójelbe tettük, hogy hivatkozni lehessen rájuk a csoport sorszámával.

A parancs

(Az olvashatóság kedvéért két sorba tördelve, de természetesen egybe kell írni.)

replace.py -page -regex -recursive -dotall -summary:Vastagtalanítás
"(\{\|.*?)'''([^\|]*?)'''(.*?\|\})" "\1\2\3"

A -page után nem írtunk címet, így a bot megkérdezi. Az idézőjel egyrészt illik a parancssori környezetbe, másrészt biztosítja az aposztróf szabad használatát a kifejezésben, mivel az már így nem számít idézőjelnek.

Az eredmény

Íme. (Gyenge gépen ne kattints!)

Saját függvények használata a javítócsomagokban[szerkesztés]

Egy kis programozással lényegesen kibővíthetjük a replace.py tudását, és csodákat művelhetünk vele. A Pywikipediának ugyanis van egy ritkán használt, nagyszerű képessége: a nemcsak konstans szöveget vagy reguláris kifejezést, hanem függvényt is írhatunk az új szöveg helyére. A keretrendszer ezt felismeri, és ilyenkor végrehajtja a függvényt, és a visszaadott értéket írja a régi szöveg helyébe. Mondani sem kell, hogy ez a reguláris kifejezésekénél összehasonlíthatatlanul nagyobb rugalmasságot tesz lehetővé a szövegcserékben. Azt is megtehetjük, hogy egy függvénnyel állítjuk elő a keresendő és az új szöveget leíró kifejezéseket (például ha sok ismétlődő rész van benne, és nem akarjuk sok helyen átírni a fejlesztésnél, vagy ha szeretnénk áttekinthetőbbé tenni).

Részletesen lásd: Szerkesztő:Bináris/Fixes and functions HOWTO (magyarul is).

Megjegyzések[szerkesztés]

Külső hivatkozások[szerkesztés]