python - progrès
June 12, 2006
Je l'ai dit en janvier, je crois, j'ai commencé à apprendre (seul avec mes petites main) la programmation en Python (pendant mon temps libre, ça va sans le dire).
J'ai laissé tombé pendant un long moment puis repris il y a environ un mois.
Comme il m'a toujours semblé plus facile d'apprendre quelque chose en pratiquant, j'ai un projet, que j'ai baptisé "AlephSuggest". Pas besoin d'être grand clerc pour deviner ce que j'envisage: récupérer mon catalogue en XML, en extraire les mots sujets, par ex., les écrire dans un fichier XML qui servira de base à un objet XMLHttpRequest pour faire AlephSuggest.
Un peu ambitieux pour un newbie, sans doute. On verra bien.
Ce que j'ai réussi à faire ce week-end (après env. 1 mois d'information générale sur Python -grâce aux excellents Dive into Python et How to Think like a Computer Scientist, Learning with Python et après 1 week-end de bricolage): extraire le texte des 610 d'une notice en XML.
Ma notice ressemble à ça:
<?xml version = "1.0" encoding = "UTF-8"?>
<record>
<record_header>
<set_entry>000000001</set_entry>
</record_header>
<doc_number>379711</doc_number>
<metadata>
<oai_marc>
<fixfield id="FMT">BK</fixfield>
<fixfield id="LDR">—–cam1-2200469-i-450-</fixfield>
<fixfield id="001">2006140431</fixfield>
<fixfield id="005">20060421110028.0</fixfield> <varfield id="010" i1=" " i2=" "> <subfield label="a">2-7314-0516-3</subfield>
<subfield label="b">Br.</subfield>
<subfield label="d">22.00 EUR</subfield>
</varfield>[...]
<varfield id="610" i1="0" i2=" ">
<subfield label="a">droit des societes</subfield>
<subfield label="a">droit civil</subfield>
<subfield label="a">contentieux</subfield>
<subfield label="a">juridiction civile</subfield>
<subfield label="a">procedure civile</subfield>
</varfield>[...]
</oai_marc>
</metadata>
</record>
Le but du jeu est de sortir de tout ça les textes des sous-champs du champs 610. En Python je fais ça:
>>> import sys
>>> from elementtree import ElementTree
>>> tree = ElementTree.parse("notice.xml"
>>> for node in tree.findall(".//varfield"): # gets the varfield tagsif node.get("id"
== "610": # only gets varfield with 610, subject in Unimarc
print node.get("id"
#prints the id just to make sure verything's all right
if node.getchildren(): # gets the subfields of varfield 610
for child in node: # loop: for each subfield..
print child.text # prints the text
Le résultat:
610
droit des societes
droit civil
contentieux
juridiction civile
procedure civile
Ces 9 lignes m'ont pris environ 8h de travail: j'ai eu une percée dimanche en buvant un whisky-coca et en me disant qu'il fallait utiliser ElementTree… C'est un début…
La suite:
- en 610 il n'y a qu'un sous-champs a, mais en 606 je devrais pouvoir gérer a, j, x, etc
- c'est sur une notice, il faut généraliser pour un ensemble de notices dans un même fichier: c'est-à-dire non pas s'arrêter au premier 610 rencontré, mais faire une boucle
- gérer les caractères accentués
S'il y a des gens qui connaissent Python dans les parages… Toute aide est bienvenue
Entry Filed under: Uncategorized. .
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed