Mehrere Einträge einer Liste in einem großen Text / string suchen?

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
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Guten Abend zusammen,

ich spiele seit ein paar Tagen nebenher an einer Idee rum, habe mich aber festgefahren...

Ich möchte wissen, ob die Einträge in einer Liste in einem längeren Text bzw string vorhanden sind. Eigentlich keine große Sache, mit einem kurzen string klappt das an anderer Stelle wunderbar, aber mit dem längeren string bekomme ich eine Fehlermeldung, die ich nicht gelöst bekomme.

Also, ich lade eine Börsenmitteilung runter, lese die aus und möchte dann prüfen ob Schlagworte aus der Liste im Text vorhanden sind.

Der relevante Code-Teil sieht so aus, zuerst die notwendigen Definitionen

Code: Alles auswählen

from selectolax.parser import HTMLParser
POSITIVEKEYWORDS = ["revenue", "record", "positive"]
USERAGENT = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'}
Und folgender Teil steckt in einer for-Schleife für bis zu 20 Durchläufe:

Code: Alles auswählen

linkToSECHtml = "https://www.sec.gov/Archives/edgar/data/1529113/000121390021054234/0001213900-21-054234.txt"

antwort = get(linkToSECHtml, headers=USERAGENT)

text = HTMLParser(antwort.text).text()
text = " ".join(text.split())

regexergebnis = search(r'Item.*SIGNATURE', text)

if any(keyword in regexergebnis for keyword in POSITIVEKEYWORDS):
    print(f"POSITIVE KEYWORD!!\n")
Der string regexergebnis ist der Teil Text, den ich haben will, alles davor und danach ist uninteressant.

Nun zum Problem: Das if any(... bricht mit folgender Fehlermeldung ab.

Code: Alles auswählen

Traceback (most recent call last):
  File "c:/Users/ah/6_8_K/6-8Ks_V005.py", line 173, in <module>
    if any(keyword in regexergebnis for keyword in POSITIVEKEYWORDS):
  File "c:/Users/ah/6_8_K/6-8Ks_V005.py", line 173, in <genexpr>
    if any(keyword in regexergebnis for keyword in POSITIVEKEYWORDS):
TypeError: argument of type 're.Match' is not iterable
Ich verstehe soweit, was die Fehlermeldung bedeutet, aber alles googlen bringt mich nicht weiter. Teilweise gibt es Erläuterungen im Netz, was das re.Match im Hintergrund macht, aber das blicke ich 2 Mal nicht... wenn es für mich zu komplex wird und dann noch auf Englisch, dann habe ich mal wieder nur Fragezeichen im Gesicht.

Grundsätzlich funktioniert der "if any(keyword in ..." Ansatz, ich nutze den in einem anderen Skript, in dem ein kürzerer string nach Schlüsselwörtern durchsucht wird, problemlos und ich kann auch in diesem Code regexergebnis z.B. durch einen kurzen string "titel" ersetzen und dann läuft es ohne Fehlermeldung.

Weiß jemand einen Rat? Ich tippe mal, daß der string regexergbnis vielleicht zu lang ist oder Zeichen enthält, die Python irgendwie nicht mag. Oder gehe ich (mal wieder) mit dem falschen Werkzeug an diese Suche ran?

Grüße
Andy
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Woher kommt get()? Woher kommt search()? Wenn du nur einen Bruchteil des Codes hier postest und wesentliche Dinge weglässt - wie soll man da helfen können?

Und: Warum glaubst du, dass der in-Operator auf einem re.Match-Objekt funktionieren sollte?
In specifications, Murphy's Law supersedes Ohm's.
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Hallo pillmuncher,

das get und search kommt hier her:

Code: Alles auswählen

from requests import get
from re import search
Und dank Deines 2. Kommentars hat es endlich geschnackelt, ich bin echt nen ... peinlich. regexergebnis ist nen Objekt und deshalb geht´s so...

Code: Alles auswählen

if any(keyword in regexergebnis[0] for keyword in POSITIVEKEYWORDS):
Danke! :wink:
Antworten