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

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

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:

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

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

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:

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

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:

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

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
BlackJack

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

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 (former) Modvoice
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

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

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.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

BlackJack hat geschrieben: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.
ich denke nicht dass es daran liegt, warum würde er sonst resultate bringen, wenn ich nur ein wort eingebe ? ich denke das problem liegt hier:

Code: Alles auswählen

XMLSyntaxError: AttValue: " or ' expected, line 8, column 15 
jedenfalls hab ichs jetzt halt so geschrieben:

Code: Alles auswählen

"http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService&SearchIndex=Books&Keywords=%s&ItemPage=%s" % (Keywords,ItemPage)
das problem taucht nur auf, wenn ich in keywords mehr als ein wort eingebe und dies über GET bekomme. wenn ich harry+potter in die url hardcode geht es.

EDIT: wenn ich harcode in die url schreibe: keywords=harry potter, statt keywords=harry+potter, dann bekomme ich den gleichen fehler.

das problem könnte sein, dass die wörter die ich im formular übergebe nicht mit + zusammengekettet werden. nur warum ? weil in der url wirds mit + angezeigt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

debian75 hat geschrieben:das problem könnte sein, dass die wörter die ich im formular übergebe nicht mit + zusammengekettet werden. nur warum ?
Hast du sie denn mit `+` zusammengekettet? Wenn nicht dann ist deine Frage damit beantwortet: wenn du es nicht machst, wer dann?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Leonidas hat geschrieben:
debian75 hat geschrieben:das problem könnte sein, dass die wörter die ich im formular übergebe nicht mit + zusammengekettet werden. nur warum ?
Hast du sie denn mit `+` zusammengekettet? Wenn nicht dann ist deine Frage damit beantwortet: wenn du es nicht machst, wer dann?
ne, hab ich nicht. ich kann mich aber auch nicht erinnern dass ich das je gemacht hätte. kann das sein, dass php das auch wieder automatisch macht ?

aber warum wird dann in der url keywords=harry+potter angezeigt ?

nun gut, wie geh ich das denn nun an ? den string in einzelne stücke zerteilen und diese mit + wieder zusammensetzen ?
Zuletzt geändert von debian75 am Dienstag 4. Dezember 2007, 23:01, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

debian75 hat geschrieben:ne, hab ich nicht. ich kann mich aber auch nicht erinnern dass ich das je gemacht hätte. kann das sein, dass php das auch wieder automatisch macht ?
Kann ich mir nicht vorstellen. Denn Leerzeichen werden in URLs normalerweise als `%20` enkodiert.
debian75 hat geschrieben:nun gut, wie geh ich das denn nun an ? den string in einzelne stücke zerteilen und diese mit + wieder zusammensetzen ?

Code: Alles auswählen

'+'.join(dein_string.split())
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

danke.

also ich hab grad in meiner php version nachgeschaut. wenn ich da im formular "harry potter" eingebe, wird das in der variable keywords and eine php funktion übergeben, die dann eine url öffnet. ich mache da keine "+" rein, das geht auch so.

könnte das ein unicode problem sein ? ich schnall nicht warum mir in der url die + angezeigt werden.
Antworten