Seite 1 von 1
RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:04
von Marvin
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: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:20
von Sirius3
@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/*')
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:25
von pixewakb
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.
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:37
von Marvin
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
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:40
von Sirius3
@Marvin: Hm, also nochmal zu meiner Anwort: XML verarbeitet man nicht mit regulären Ausdrücken sondern mit einem XML-Parser.
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 15:56
von Marvin
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
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 16:08
von Sirius3
@Marvin: was auch immer Du denkst, was eine Webseite ist, es sind definitiv XML-Daten, und XML-Daten verarbeitet man mit einem XML-Parser.
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 16:18
von DasIch
Marvin hat geschrieben:deshlab dachte ich es ist eine XML Datei. es ist halt eine Webseite
HTML, welches dies definitiv nicht ist, kann man auch nicht mir regulären Ausdrücken parsen.
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 16:59
von pixewakb
Ich habe keinen Schimmer, was genau du bekommst, also von deiner Webseite.
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
>>>
"""
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.
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 17:18
von cofi
@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
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 17:26
von pillmuncher
@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).
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 17:29
von Sirius3
@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:
Code: Alles auswählen
print xml_soup.find("fsapiResponse ", recursive=False).find("value", recursive=False).find(True).text
Re: RE.Search Frage
Verfasst: Donnerstag 31. Dezember 2015, 19:11
von pixewakb
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.
Re: RE.Search Frage
Verfasst: Freitag 1. Januar 2016, 17:07
von BlackJack
@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.