xml newb hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Donnerstag 29. November 2007, 10:01

hallo leute,

ich möchte gerne ein xml, welches ich in einer veriablen habe durchsuchen.
also ich mache einen request und bekomme als resultat xml und das speichere ich in einer variable "result". was ich in der variable "result" habe ist der quelltext von der seite: http://www.snee.com/xml/trxml50/vu.xml

das steht dann halt auch das drin: <?xml version="1.0" encoding="UTF-8"?>

jetzt möchte ich im prinzip für jedes <detail></detail> Paar alles printen mit irgendwas was standard python ist, wie z.b ElementTree oder so...aber ich komm damit nicht klar, bzw. weiss gar nicht ob das so geht aus dem source vom xml ?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 29. November 2007, 10:46

Hilft das hier weiter?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 29. November 2007, 11:28

Hallo debian75!

Code: Alles auswählen

PyShell 0.9.5 - The Flakiest Python Shell
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     from elementtree import ElementTree as et
... except ImportError:
...     from xml.etree import ElementTree as et 
...     
>>> xml = """..."""
>>> root = et.fromstring(xml)
>>> for details in root.findall("Details"):
...     print
...     print "-" * 30
...     for child in details:
...         print "%s: %s" % (child.tag, child.text)
...     print "-" * 30
...     

------------------------------
Asin: B000002G7C
ProductName: Velvet Underground & Nico
Catalog: Music
Artists: 
         
ReleaseDate: 07 May, 1996
Manufacturer: Polygram Records
ImageUrlSmall: http://images.amazon.com/images/P/B000002G7C.01.THUMBZZZ.jpg
ImageUrlMedium: http://images.amazon.com/images/P/B000002G7C.01.MZZZZZZZ.jpg
ImageUrlLarge: http://images.amazon.com/images/P/B000002G7C.01.LZZZZZZZ.jpg
Availability: Usually ships within 24 hours
ListPrice: $9.98
OurPrice: $9.98
UsedPrice: $4.99
------------------------------
[...]
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Donnerstag 29. November 2007, 13:18

many thanks :D
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Freitag 30. November 2007, 00:33

hi gerold

ich hab den code an ein neues xml angepasst und bekomme nur eine leere seite zurück ? ich glaub ich steh auf dem schlauch.

Code: Alles auswählen


import urllib
from xml.etree import ElementTree as etree
def amazon():
	url = 'http://www.motolink.ch/amazon.xml'
	page = urllib.urlopen(url)
	pagedata = page.read()
	root = etree.fromstring(pagedata)
	for item in root.findall("Item"):
		print
		for child in item:
			print "%s: %s" % (child.tag, child.text)
amazon()
ich seh irgendwie ned warum das nicht geht, weil dein code hat mit dem anderen xml funktioniert aber mit diesem hier nicht.

vielen dank für deine hilfe.

gruss

d
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 30. November 2007, 08:30

Hallo debian75!

Keine Ahnung!!! :K

Aber es hat wahrscheinlich etwas mit dem Namespace (xmlns) zu tun.

``root.findall("Items")`` findet auch nichts. Obwohl dieses direkt unterhalb von *root* zu finden sein sollte.

Code: Alles auswählen

root.findall("{http://webservices.amazon.com/AWSECommerceService/2007-07-16}Items")
findet etwas aber das kann doch nicht so gewollt sein. :roll:

Hoffentlich kann dir ein anderer sagen wie man das richtig macht. Wenn nicht, dann kommst du evt. mit BeautifulSoup http://www.crummy.com/software/BeautifulSoup/ weiter.

mfg
Gerold
:-)

PS: Vielleicht macht das LXML besser. Weiß das jemand?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Sonntag 2. Dezember 2007, 01:32

mensch, ich raffs ned. ich hab jetzt mit so ziemlich allem probiert aber ich bekomme nix raus :(

ich hasse xml
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 2. Dezember 2007, 07:42

debian75 hat geschrieben:ich hasse xml
Hallo debian75!

Ich hasse, wie mit Namespaces umständlich gearbeitet werden muss. :roll:

Wie auch immer... Mit lxml kann man den Namespace-String auslesen. Dieser ist (bei Verwendung von Namespaces) Teil jedes Tag-Names.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

from lxml import etree
import urllib2


xml = urllib2.urlopen("http://www.motolink.ch/amazon.xml").read()
root = etree.fromstring(xml)

ns = "{%s}" % root.nsmap[None]
items = root.find(ns + "Items")
for item in items.findall(ns + "Item"):
    print
    for child in item:
        print "%s: %s" % (child.tag, child.text)
mfg
Gerold
:-)

PS: http://codespeak.net/lxml/tutorial.html
PS2: ``easy_install lxml`` --> http://peak.telecommunity.com/DevCenter/EasyInstall
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Sonntag 2. Dezember 2007, 12:30

ok, das funktioniert, vielen dank !!
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Montag 3. Dezember 2007, 00:06

noch ne kleine frage. kann man, wenn man den namen von nem subtag kennt, direkt auf diesen zugreifen, bzw. geht das über mehrere levels ?

also:

Code: Alles auswählen

<item>
  <asin>1234</asin>
  <SmallImage>
        <URL>http://smallimage.com</URL>
  </SmallImage>
</item>
jetzt weiss ich ja, dass ich direkt den inhalt der URL will und mir der SmallImage tag nichts bringt...kann ich direkt auf url zugreifen ?

also sowas in der art:

Code: Alles auswählen

for item in items.findall(ns + "Item"):
		print item.findtext(ns + "ASIN")
		print item.(ns +SmallImage).findtext(ns + "URL")


EDIT:

ok, so scheints zu gehen:

Code: Alles auswählen

for item in items.findall(ns + "Item"):
		print item.findtext(ns + "ASIN")
		print item.find(ns + "SmallImage").findtext(ns + "URL")


oder gibts ne bessere möglichkeit ?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 3. Dezember 2007, 00:16

Ich finde ja seitdem ich jQuery nutze CSS selectors gut, es gibt einen Erweiterung für BeautifulSoup, soupselect mit der man so etwas nutzen kann. ElementTree scheint aber auch XPath zu unterstützen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 3. Dezember 2007, 08:13

Das original ElementTree unterstützt nur eine kleine Untermenge von XPath. `lxml` hat dagegen volle XPath-Unterstützung.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 3. Dezember 2007, 10:57

BlackJack hat geschrieben:Das original ElementTree unterstützt nur eine kleine Untermenge von XPath. `lxml` hat dagegen volle XPath-Unterstützung.
Das habe ich mir schon gedacht und das ist ja auch sinnvoll so (schließlich hat `lxml` libxml2 zur Verfügung), aber vielleicht reicht die XPath-Unterstützung von ElementTree ja bereits.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Montag 3. Dezember 2007, 23:15

salve,

gleich wieder ein neues problem :)

im query zu amazon web services hab ich folgendes:

Code: Alles auswählen

url = 'http://blablabla?Keywords='+Keywords+'&ItemPage='+ItemPage''
page = urllib.urlopen(url)
problem: wenn ich nach einem einzigen wort suche, dann geht das. also z.b wenn ich nach "potter" suche bekomme ich das resultat.

wenn ich hingegen nach harry potter suche, dann sieht die url so aus:
Keywords=hatty+potter, was der xml parser irgendwie nicht verträgt weil ich folgende meldung bekomme:

Code: Alles auswählen

Traceback (most recent call last):
  File "c:\python25\lib\site-packages\cherrypy-3.1b1-py2.5.egg\cherrypy\_cprequest.py", line 564, in respond
    cherrypy.response.body = self.handler()
  File "c:\python25\lib\site-packages\cherrypy-3.1b1-py2.5.egg\cherrypy\_cpdispatch.py", line 24, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "C:\Python25\test\cptest.py", line 70, in search
    root = etree.fromstring(pagedata)
  File "lxml.etree.pyx", line 2169, in lxml.etree.fromstring
  File "parser.pxi", line 1715, in lxml.etree._parseMemoryDocument
  File "parser.pxi", line 1613, in lxml.etree._parseDoc
  File "parser.pxi", line 773, in lxml.etree._BaseParser._parseDoc
  File "parser.pxi", line 445, in lxml.etree._ParserContext._handleParseResultDoc
  File "parser.pxi", line 524, in lxml.etree._handleParseResult
  File "parser.pxi", line 472, in lxml.etree._raiseParseError
XMLSyntaxError: AttValue: " or ' expected, line 8, column 15
warum motzt der wegen den hochkomma ? ich hab doch welche drin. und wenn ich die url so in amazon eingebe, dann bekomm ich auch ein resultat.

muss ich mehrteilige strings irgendwie vorher behandeln ?
BlackJack

Dienstag 4. Dezember 2007, 08:27

Du hast in dem gezeigten Beispiel *keine* Hochkommata in der Zeichenkette, allerdings einen Syntax-Fehler bei eben jenen:

Code: Alles auswählen

In [31]: Keywords = 'harry+potter'

In [32]: 'http://blablabla?Keywords='+Keywords+'&ItemPage='+ItemPage''
------------------------------------------------------------
   File "<ipython console>", line 1
     'http://blablabla?Keywords='+Keywords+'&ItemPage='+ItemPage''
                                                                 ^
<type 'exceptions.SyntaxError'>: invalid syntax
Bitte immer den Code zeigen, der auch zum Traceback geführt hat, sonst kann man nur raten wo denn das wirkliche Problem liegt.
Antworten