Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

xpath sur python

3 réponses
Avatar
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()
-----

3 réponses

Avatar
Alain Ketterlin
Vincent Pottier writes:

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.
Avatar
Vincent Pottier
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
Avatar
NicolasP
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
-----
<?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()
-----