String zwischen Zeichen String

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
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Hi,
Ich würde gerne aus dem folgendem Text die URL raus filtern und den Namen. Problem bei der Sache ist ich habe mehrere solcher Texte, bei denen sich die Zahl (100) ändert die URL und der Name ändern sich logischerweise auch. Habe es mit replace versucht und pre und Post die Zahl heraus zu filtern um diese dann aus dem String entfernen zu können. Jemand eine Idee? :(
text = '<li class="hallo-100"><a href="https://test.xy">testname</a>'

data = text.replace(' ','').replace(' ','').replace('<','').replace('>','').replace('"','',2).replace('=','').replace('-','')
pre = 'liclasscatitemcatitem'
post = 'ahref'
data = data[len(pre):-len(post)]
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Ist das tatsächlich das, was du als Vorlage hast? Oder parst du HTML-Code?
In letzterem Fall: Nutze einen HTML-Parser wie beautifulsoup.

Nee, ich korrigiere: Nimm auf jeden Fall beautifulsoup.
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Hi, danke. beautifulsoup ich Google Mal
Wie kann ich importieren?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Du brauchst nicht googeln.
Es sollte reichen, wenn du dem Link aus meinem Beitrag folgst.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Falls `text` wirklich der Ausgangspunkt ist:

Code: Alles auswählen

In [212]: text = '<li class="hallo-100"><a href="https://test.xy">testname</a>' 

In [213]: soup = bs4.BeautifulSoup(text, "html.parser")                         

In [214]: soup.a                                                                
Out[214]: <a href="https://test.xy">testname</a>

In [215]: soup.a["href"]                                                        
Out[215]: 'https://test.xy'
Aber wahrscheinlich kommt das ja auch einem kompletten HTML-Dokument, da sollte man also auch bis zu dem was in `text` repräsentiert ist, mit `BeautifulSoup` kommen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Oh den link habe ich wohl übersehen, danke. Ja es ist nur der Ausschnitt in Text um Dehn es geht. Ich lasse mir diesen Ausschnitt aus einer Webseite geben.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LRK: Was heisst Du lässt Dir den Ausschnitt aus einer Webseite geben? Wenn Du den da mit Zeichenkettenoperationen heraus holst, ohne zu berücksichtigen/zu nutzen, dass es sich bei HTML um ein strukturiertes Dokument handelt, dann solltest Du mit dem HTML-Parser nicht erst bei dem gezeigten Ausschnitt ansetzen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Warum darf ich nicht erst da ansetzen?
Ich lade mir die seite Und durchsuche sie nach einem string und lasse mir die Zeilen ausgeben.
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
link = response.read()
response.close()

with open(test_file2,"w") as testf:
testf.write("")

for line in link:
if "cat-item cat-item" in line:
from bs4 import BeautifulSoup
soup = BeautifulSoup(line, "html.parser")
link = soup.a["href"]

with open(test_file2,"a") as testf:
testf.write('{}\n'.format(link))
/quote]
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Sry ich bekomme das mit der Formatierung nicht richtig hin, wenn ich das Script hier poste.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@LRK: HTML-Dateien sind keine Text-Dateien, sondern deutlich komplexer. Mit Beautiful-Soup kannst Du bequem die Stelle im HTML suchen, die Du brauchst, da mußt Du ja nicht zwei verschiedene Methoden einsetzen.

Zum Code:
urlopen solltest Du auch mit with benutzen.
Einen leeren String zu schreiben, macht keinen Sinn. Du solltest die Datei einmal öffnen und nicht bei jeder Zeile neu.
Importe gehören alle an den Anfang der Datei.

Für Code im Forum, benutze [ code ] -Tags, der </>-Knopf im vollständigen Editor.
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Danke Sirius3, werde gleich Mal versuchen das schnell um zu setzen.

Urlopen mit with bekomme ich folgenden Fehler.

with urllib2.urlopen(req) as response:
AttributeError: addinfourl instance has no attribute '__exit__'
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Ach, Du benutzt noch Python2. Das ist veraltet und Du solltest auf Python3 umsteigen.
LRK
User
Beiträge: 38
Registriert: Sonntag 16. Juni 2019, 21:00

Scheint so. XBMC Kodi
Und ich mache alles am Smartphone. S9
Antworten