Hallo zusammen,
ich bin leider absoluter Python Anfänger benötige aber für ein Projekt mit einem WLAN Radio mal eure Hilfe.
Ich muss aus einer XML Datei die ich abfrage einen Wert abrufen.
Das ist die Datei:
<fsapiResponse>
<status>FS_OK</status>
<value>
<u8>5</u8>
</value>
</fsapiResponse>
und zwar benötige ich den Wert in diesem Fall 5. (Das ist die aktuelle Lautstärke des Radios)
Ich habe ein bisschen gebastelt und bin soweit das er mir immer einen Wert rausschmeißt und zwar den ersten (8).
Hier mein aktueller Code:
vol = re.search('([0-24]+)', tmp)
Ihr könnt mir sicher helfen oder?
Vielen Dank schonmal!
RE.Search Frage
@Marvin; mit dem regulären Ausdruck bekommst Du sicher nicht '8' als Ergebnis. XML verarbeitet man auch nicht mit regulären Ausdrücken sondern mit einem XML-Parser, z.B. xml.etree.ElementTree:
Code: Alles auswählen
import xml.etree.ElementTree as ET
response = ET.parse(filename)
print response.findtext('value/*')
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
Damit lässt sich auch XML parsen. Ich meine, dass unter der Motorhaube eine andere Bibliothek das XML-Parsen übernimmt. Der Zugriff ist damit m. E. sehr elegant möglich.
Damit lässt sich auch XML parsen. Ich meine, dass unter der Motorhaube eine andere Bibliothek das XML-Parsen übernimmt. Der Zugriff ist damit m. E. sehr elegant möglich.
Hm also nochmal zu meinem Problem - ich gehe auf eine Webseite http://192.168.x.xx/fsapi/GET/netRemote ... d=xxxxxxxx
dort bekomme ich dann Angezeigt:
<fsapiResponse>
<status>FS_OK</status>
<value>
<u8>5</u8>
</value>
</fsapiResponse>
Ich benötige nur den Wert zwischen den beiden 8. in diesem Fall 5.
Mit meinem aktuellen Code bekomme ich als Ergebnis 8 und wenn ich das ganze umschreibe in
vol2 = re.search('([0-7]+)', tmp)
bekomme ich auch den richtigen Wert 5 wenn ich den an dem Radio auf z.B. 3 ändere zeigt das Skript mir das auch schon richtig an.
Ich muss ihm irgendwie nur sagen das er nur die Zahl in der mitte beachten soll
dort bekomme ich dann Angezeigt:
<fsapiResponse>
<status>FS_OK</status>
<value>
<u8>5</u8>
</value>
</fsapiResponse>
Ich benötige nur den Wert zwischen den beiden 8. in diesem Fall 5.
Mit meinem aktuellen Code bekomme ich als Ergebnis 8 und wenn ich das ganze umschreibe in
vol2 = re.search('([0-7]+)', tmp)
bekomme ich auch den richtigen Wert 5 wenn ich den an dem Radio auf z.B. 3 ändere zeigt das Skript mir das auch schon richtig an.
Ich muss ihm irgendwie nur sagen das er nur die Zahl in der mitte beachten soll
ja gut es steht halt folgendes drüber: This XML file does not appear to have any style information associated with it. The document tree is shown below.
deshlab dachte ich es ist eine XML Datei. es ist halt eine Webseite
deshlab dachte ich es ist eine XML Datei. es ist halt eine Webseite
Ich habe keinen Schimmer, was genau du bekommst, also von deiner Webseite.
Die Webseite hole ich mit mit webpage = requests.get(url).text. Die beiden von mir genannten Module sind in der täglichen Arbeit sehr, sehr angenehm.
Code: Alles auswählen
from bs4 import BeautifulSoup
xml = """<fsapiResponse>
<status>FS_OK</status>
<value>
<u8>5</u8>
</value>
</fsapiResponse>"""
xml_soup = BeautifulSoup(xml, "xml")
results = xml_soup.find_all("u8")
print(results)
for result in results:
print(result.text)
"""
>>>
[<u8>5</u8>]
5
>>>
"""
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
@Marvin: Diesen Text zeigt ein Browser, wenn er XML zeigen soll, aber es eben kein Stylesheet dafuer gibt, das enthalten koennte, wie der Browser es anzeigen soll.
Ein Browser kann jede Menge Dateitypen anzeigen, die keine Websites sind, z.B. auch Text und Bilder.
Darum: Das ist XML. Sogar der Browser sagt das ja in dem zitierten Text.
Eine Alternative zu BeautifulSoup, die auch in der Standardbibliothek enthalten ist: ElementTree
Ein Browser kann jede Menge Dateitypen anzeigen, die keine Websites sind, z.B. auch Text und Bilder.
Darum: Das ist XML. Sogar der Browser sagt das ja in dem zitierten Text.
Eine Alternative zu BeautifulSoup, die auch in der Standardbibliothek enthalten ist: ElementTree
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@Marvin: Warum Reguläre Ausdrücke nicht geeignet sind, um XML zu parsen, wird in diesem Wikipedia-Artikel zum Thema Chomsky-Hierarchie erklärt (auch, wenn das dort nicht explizit erwähnt wird).
In specifications, Murphy's Law supersedes Ohm's.
@pixewakb: da das Problem mit Python-Bordmitteln in einem Zweizeiler zu lösen ist, halte ich hier BeautifulSoup (bei komplexeren Problemen durchaus viel mächtiger) für Kanonen-auf-Spatzen-schießen.
Konkret zu Deinem Code: es gibt genau ein Ergebnis, warum also find_all? Die semantische Information liegt im <value>-Tag. Das <u8> ist nur eine Typ-Information. Die Suche ist also bei Dir zu unspezifisch, was bei komplexeren Problemen wiederum zu schwer zu findenden Fehlern führen kann. Sei also so spezifisch wie möglich, was aber mit bs4 nur wieder sehr umständlich ist:
Konkret zu Deinem Code: es gibt genau ein Ergebnis, warum also find_all? Die semantische Information liegt im <value>-Tag. Das <u8> ist nur eine Typ-Information. Die Suche ist also bei Dir zu unspezifisch, was bei komplexeren Problemen wiederum zu schwer zu findenden Fehlern führen kann. Sei also so spezifisch wie möglich, was aber mit bs4 nur wieder sehr umständlich ist:
Code: Alles auswählen
print xml_soup.find("fsapiResponse ", recursive=False).find("value", recursive=False).find(True).text
Danke für die Rückantwort! Für den Thread-Starter könnte Beispielcode hilfreich sein; ich erinnere mich an meine ersten Berührungen mit XML und ich habe das damals wie Text durchsucht (for line in ...). Ich erinnere mich, dass das früher und teilweise noch heute ziemlich anspruchsvolles Zeugs ist.
@Sirius3: Ich nutzte find_all, weil ich der Meinung war, dass möglicherweise sein XML komplexer ist.
Was bewirkt bei dir recursive=False!? Wie funktioniert bei dir .find(True)?
Ich nutze bs4 standardmäßig, weil ich i. d. R. da mehr zu erledigen habe und die Webseiten i. d. R. auch größer sind.
@Sirius3: Ich nutzte find_all, weil ich der Meinung war, dass möglicherweise sein XML komplexer ist.
Was bewirkt bei dir recursive=False!? Wie funktioniert bei dir .find(True)?
Ich nutze bs4 standardmäßig, weil ich i. d. R. da mehr zu erledigen habe und die Webseiten i. d. R. auch größer sind.
@pixewakb: `bs4` kann man ja auch für kleine Webseiten benutzen, weil die Python-Standardbibliothek da auch nichts brauchbares für mitliefert, aber hier ging es um XML und nicht um HTML.