xml newb hilfe
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 ?
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 ?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo debian75!
mfg
Gerold
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
------------------------------
[...]
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.
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
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()
vielen dank für deine hilfe.
gruss
d
- 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.
findet etwas aber das kann doch nicht so gewollt sein.
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?
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")
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo debian75!debian75 hat geschrieben:ich hasse xml
Ich hasse, wie mit Namespaces umständlich gearbeitet werden muss.
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)
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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:
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:
EDIT:
ok, so scheints zu gehen:
oder gibts ne bessere möglichkeit ?
also:
Code: Alles auswählen
<item>
<asin>1234</asin>
<SmallImage>
<URL>http://smallimage.com</URL>
</SmallImage>
</item>
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 ?
-
- 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
Das original ElementTree unterstützt nur eine kleine Untermenge von XPath. `lxml` hat dagegen volle XPath-Unterstützung.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.BlackJack hat geschrieben:Das original ElementTree unterstützt nur eine kleine Untermenge von XPath. `lxml` hat dagegen volle XPath-Unterstützung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
salve,
gleich wieder ein neues problem
im query zu amazon web services hab ich folgendes:
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:
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 ?
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)
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
muss ich mehrteilige strings irgendwie vorher behandeln ?
Du hast in dem gezeigten Beispiel *keine* Hochkommata in der Zeichenkette, allerdings einen Syntax-Fehler bei eben jenen:
Bitte immer den Code zeigen, der auch zum Traceback geführt hat, sonst kann man nur raten wo denn das wirkliche Problem liegt.
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
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:BlackJack hat geschrieben:Du hast in dem gezeigten Beispiel *keine* Hochkommata in der Zeichenkette, allerdings einen Syntax-Fehler bei eben jenen:
Bitte immer den Code zeigen, der auch zum Traceback geführt hat, sonst kann man nur raten wo denn das wirkliche Problem liegt.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
Code: Alles auswählen
XMLSyntaxError: AttValue: " or ' expected, line 8, column 15
Code: Alles auswählen
"http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService&SearchIndex=Books&Keywords=%s&ItemPage=%s" % (Keywords,ItemPage)
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hast du sie denn mit `+` zusammengekettet? Wenn nicht dann ist deine Frage damit beantwortet: wenn du es nicht machst, wer dann?debian75 hat geschrieben:das problem könnte sein, dass die wörter die ich im formular übergebe nicht mit + zusammengekettet werden. nur warum ?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 ?Leonidas hat geschrieben:Hast du sie denn mit `+` zusammengekettet? Wenn nicht dann ist deine Frage damit beantwortet: wenn du es nicht machst, wer dann?debian75 hat geschrieben:das problem könnte sein, dass die wörter die ich im formular übergebe nicht mit + zusammengekettet werden. nur warum ?
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kann ich mir nicht vorstellen. Denn Leerzeichen werden in URLs normalerweise als `%20` enkodiert.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 ?
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
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.
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.