Selenium innerHTML Liste, nur bestimmtes ausgeben

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
denis22934
User
Beiträge: 9
Registriert: Freitag 11. September 2020, 16:10

Hallo,

erst einmal, ich bin arbeite noch nicht so lange mit Python, vor allem nicht mit Selenium. Ich habe mich also mit dem Webdriver auf eine Seite connected und mir auch schon das InnerHTML, welches ich brauche geschnappt. Hier ist mein Problem, InnerHTML ist eine "Liste" und ich will nur einen Wert ausgeben. Sieht in etwa so aus:

Code: Alles auswählen

<html>
 <body>
  <pre style="example" xpath="1">
   "amount": 12{
   "value" : 3
    },
  </pre>
 </body>
</html>
^Ist nur zur Veranschaulichung, weil das Eigentliche viel länger ist. InnerHTML würde ja jetzt so aussehen:

Code: Alles auswählen

"amount": 12{
   "value" : 3
    },
^An dem Punkt bin ich jetzt. Ich kann nicht eine Linie angeben, da die Seite nicht statisch ist. Wie lass ich python aus der Variable in der InnerHTML steckt "value" finden ? Bitte beachten nach "value" steht ein Doppelpunkt!

Vielen Vielen dank schonmal im Voraus!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es wäre wichtig, zu wissen, wie das exakte Format aussehen kann. Dank Deiner Kürzungen sieht es wie kaputtes JSON aus, und ohne die Kürzungen ist es wahrscheinlich korrektes JSON, was sich einfach parsen läßt.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo denis22934,

es währe hilfreich, wenn du auch noch wenigstens Teile des Pythoncodes zeigen könntest.
Wie schon angemerkt, ist es nicht ganz klar nach welchen Gesetzmäßigkeiten "innerHTML" wirklich aufgebaut ist.

Ich vermute, dass das was du "Liste" nennst in Python eigentlich ein String ist, in dem du bestimmte Elemente finde möchtest, oder?

Für dein Beispiel könnte man das so machen:

Code: Alles auswählen

inner_html = """"amount": 12{
   "value" : 3
    },
"""

# inner html in einzelne durch linebreaks getrennte Zeilen aufteilen
for line in inner_html.split("\n"):

    # falls der string "value" in einer Zeile vorkommt, diese anhand des Doppelpunkts teilen
    if "value"in line:
        _, number_string = line.split(":")

        # remove spaces from number_string and convert to int
        number = int(number_string.strip())
    
        print(f"Found number: {number}")

Ausgabe: Found number: 3


Das wird nur funktionieren wenn der obige Algorithmus zu den Gesetzmäßigkeiten, nach denen der String aufgebaut ist passt.

Falls innerHTML in Wirklichkeit ein JSON-string ist, kann man diesen in einen Dictionary parsen und kommt dann leicht über die Schlüssel an die Daten:

Code: Alles auswählen

list_data = json.loads(inner_html_json_string)
print(f"Found: {list_data['value']}")
Wenn es nicht anders geht müsste man vielleicht regular expressions verwenden.
Antworten