Seite 1 von 1

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

Verfasst: Sonntag 24. Oktober 2021, 20:01
von August1328
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

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

Verfasst: Sonntag 24. Oktober 2021, 20:18
von pillmuncher
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?

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

Verfasst: Sonntag 24. Oktober 2021, 20:54
von August1328
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: