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.