xpath sur python

Le
Vincent Pottier
Bonjour,
J'essaie d'écrire un bout de code pour OpenStreetMap et je découvre
python.
J'aimerai analyser un fichier GPX avec XPath via libxml (qui devrait
permettre une utilisation fine de XPath).
(en gros, pour ceux que ça intéresse, il s'agit, dans une trace GPS faite
dans des transports en commun, de repérer les arrêts puis d'aller
chercher, via nominatim, ce qui existe dans OpenStreetMap, puis enfin
d'enrichir une base des horaires de transports)
Pour mes tests du langage python j'essaie dans un premier temps
d'extraire les tags 'ele'
Les contenus des fichiers sont ci-dessous.
En python 2.6 je ne parviens pas à un résultat :
//* me retourne la liste des nœuds mais
//ele ne renvoie rien

En python 3.1, j'ai l'erreur suivante :
Traceback (most recent call last):
File "./readGpx2.py", line 3, in <module>
import libxml2, sys
ImportError: No module named libxml2

Malgré mes recherches, je ne sais pas comment implémenter libxml pour
python 3.1 (bon je ne suis pas un as de la ligne de commande et de
linux ;-)

Je précise que dans jEdit (avec le plugin XSLT)
le xpath //ele retourne bien 10 nœuds.

Vos conseils seront les bien venus. Merci.

==
Contenu du fichier 20100704.gpx
--
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="" version="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://
www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
<name>ACTIVE LOG071934</name>
<trkseg>
<trkpt lat="48.697180" lon="2.194601">
<ele>33.823</ele>
<time>2010-04-07T05:19:34Z</time>
</trkpt>
</trkseg>
</trk>
<trk>
<name>ACTIVE LOG140024</name>
<trkseg>
<trkpt lat="48.697055" lon="2.195064">
<ele>124.733</ele>
<time>2010-04-07T12:00:24Z</time>
</trkpt>
<trkpt lat="48.697074" lon="2.195057">
<ele>108.986</ele>
<time>2010-04-07T12:01:08Z</time>
</trkpt>
<trkpt lat="48.697264" lon="2.194733">
<ele>100.121</ele>
<time>2010-04-07T12:01:54Z</time>
</trkpt>
<trkpt lat="48.697153" lon="2.195209">
<ele>100.608</ele>
<time>2010-04-07T12:02:17Z</time>
</trkpt>
<trkpt lat="48.697140" lon="2.195106">
<ele>102.053</ele>
<time>2010-04-07T12:02:37Z</time>
</trkpt>
<trkpt lat="48.697201" lon="2.194857">
<ele>103.222</ele>
<time>2010-04-07T12:03:17Z</time>
</trkpt>
<trkpt lat="48.697188" lon="2.194856">
<ele>107.266</ele>
<time>2010-04-07T12:04:40Z</time>
</trkpt>
<trkpt lat="48.697202" lon="2.194761">
<ele>102.466</ele>
<time>2010-04-07T12:05:46Z</time>
</trkpt>
<trkpt lat="48.697200" lon="2.194869">
<ele>103.805</ele>
<time>2010-04-07T12:07:37Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
--
contenu du fichier readGpx.py
--
#!/usr/bin/env python3.1

import libxml2, sys


# name = raw_input("File name ")
name = "20100407.gpx"
node = "*"
path = "//" + node

doc = libxml2.parseFile(name)
if doc.name != name:
print ("doc.name " + name + " failed")
sys.exit(1)

# root = doc.children
# if root.name != "gpx":
# print "root.name failed"
# sys.exit(1)
# else:
# print "root gpx found"

ctxt = doc.xpathNewContext()
res = ctxt.xpathEval(path)
print ("found " + str(len(res)) + " " + node + " at " + path)
for n in res:
#print "__" + str(n)
print (n.name)

doc.freeDoc()
ctxt.xpathFreeContext()
--
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #21539371
Vincent Pottier
En python 3.1, j'ai l'erreur suivante :
Traceback (most recent call last):
File "./readGpx2.py", line 3, in <module>
import libxml2, sys
ImportError: No module named libxml2



T'es sous linux, c'est ça ? Chez moi (ubuntu 9.10) il faut installer
cela à part, et ça s'appelle... python-libxml2.

Il y a aussi des exemples (et des conseils pertinents) à
http://stackoverflow.com/questions/8692/how-to-use-xpath-in-python
mais j'imagine que tu as déjà vu cela.

-- Alain.
Vincent Pottier
Le #21539691
Le Mon, 12 Apr 2010 14:16:51 +0200, Alain Ketterlin a écrit :


T'es sous linux, c'est ça ?


ubuntu 9.10 aussi
Chez moi (ubuntu 9.10) il faut installer
cela à part, et ça s'appelle... python-libxml2.


C'est bien ce que j'ai compris.
Mais on trouve ça où ?
On l'installe comment ? et où ?

Il y a aussi des exemples (et des conseils pertinents) à
http://stackoverflow.com/questions/8692/how-to-use-xpath-in-python mais
j'imagine que tu as déjà vu cela.


Oui, mon test (sur python 2.6) vient de là.
De fait, "//*[name()='ele']" fonctionne (10 nœuds)
mais pas "//ele"
C'est un peu fastidieux !

-- Alain.


Merci
NicolasP
Le #21543801
Bonjour,

Bonjour,
J'essaie d'écrire un bout de code pour OpenStreetMap et je découvre
python.
J'aimerai analyser un fichier GPX avec XPath via libxml (qui devrait
permettre une utilisation fine de XPath).
(en gros, pour ceux que ça intéresse, il s'agit, dans une trace GPS faite
dans des transports en commun, de repérer les arrêts puis d'aller
chercher, via nominatim, ce qui existe dans OpenStreetMap, puis enfin
d'enrichir une base des horaires de transports)
Pour mes tests du langage python j'essaie dans un premier temps
d'extraire les tags 'ele'
Les contenus des fichiers sont ci-dessous.
En python 2.6 je ne parviens pas à un résultat :
//* me retourne la liste des nœuds mais
//ele ne renvoie rien

En python 3.1, j'ai l'erreur suivante :
Traceback (most recent call last):
File "./readGpx2.py", line 3, in<module>
import libxml2, sys
ImportError: No module named libxml2



Attention ! Python 3.x est différent de Python 2.x.
Le code écrit pour du Python 3.x est incompatible avec Python 2.x.
La majorité de la littérature existante est faite pour Python 2.x.


Nicolas


Malgré mes recherches, je ne sais pas comment implémenter libxml pour
python 3.1 (bon je ne suis pas un as de la ligne de commande et de
linux ;-)

Je précise que dans jEdit (avec le plugin XSLT)
le xpath //ele retourne bien 10 nœuds.

Vos conseils seront les bien venus. Merci.

==== > Contenu du fichier 20100704.gpx
-----
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="" version="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://
www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
<name>ACTIVE LOG071934</name>
<trkseg>
<time>2010-04-07T05:19:34Z</time>
</trkpt>
</trkseg>
</trk>
<trk>
<name>ACTIVE LOG140024</name>
<trkseg>
<time>2010-04-07T12:00:24Z</time>
</trkpt>
<time>2010-04-07T12:01:08Z</time>
</trkpt>
<time>2010-04-07T12:01:54Z</time>
</trkpt>
<time>2010-04-07T12:02:17Z</time>
</trkpt>
<time>2010-04-07T12:02:37Z</time>
</trkpt>
<time>2010-04-07T12:03:17Z</time>
</trkpt>
<time>2010-04-07T12:04:40Z</time>
</trkpt>
<time>2010-04-07T12:05:46Z</time>
</trkpt>
<time>2010-04-07T12:07:37Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
-----
contenu du fichier readGpx.py
-----
#!/usr/bin/env python3.1

import libxml2, sys


# name = raw_input("File name ")
name = "20100407.gpx"
node = "*"
path = "//" + node

doc = libxml2.parseFile(name)
if doc.name != name:
print ("doc.name " + name + " failed")
sys.exit(1)

# root = doc.children
# if root.name != "gpx":
# print "root.name failed"
# sys.exit(1)
# else:
# print "root gpx found"

ctxt = doc.xpathNewContext()
res = ctxt.xpathEval(path)
print ("found " + str(len(res)) + " " + node + " at " + path)
for n in res:
#print "__" + str(n)
print (n.name)

doc.freeDoc()
ctxt.xpathFreeContext()
-----
Publicité
Poster une réponse
Anonyme