RE.Search Frage

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.
Antworten
Marvin
User
Beiträge: 3
Registriert: Donnerstag 31. Dezember 2015, 14:51

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!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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/*')
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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.
Marvin
User
Beiträge: 3
Registriert: Donnerstag 31. Dezember 2015, 14:51

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Marvin: Hm, also nochmal zu meiner Anwort: XML verarbeitet man nicht mit regulären Ausdrücken sondern mit einem XML-Parser.
Marvin
User
Beiträge: 3
Registriert: Donnerstag 31. Dezember 2015, 14:51

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Marvin: was auch immer Du denkst, was eine Webseite ist, es sind definitiv XML-Daten, und XML-Daten verarbeitet man mit einem XML-Parser.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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.
Benutzeravatar
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
Benutzeravatar
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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

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.
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.
Antworten