Sonderzeichen " ' , [ ] Aus Liste entfernen

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
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

folgendes Problem habe ich, vielleicht weiss ja einer von euch, was da zu machen ist?

In meinem Programm gibt es eine Liste, die alle Unterlinks einer Hauptseite beeinhaltet. Bei der Ausgabe dieser Liste sieht es so aus:

"'https://kenfm.de/zur-sache-migration-und-markt/',", "'https://kenfm.de/zur-sache-venezuela-und-der-iran/',", "['https://kenfm.de/sendungen/',"]

Es will mir nach x-Stunden nicht gelingen, aus der Liste die Elemente
"
'
,
]
[

zu entfernen UND den reinen Hyperlink:
https://kenfm.de/zur-sache-venezuela-und-der-iran/

zu extrahieren, also ohne diese merkwürdigen Elemente " ' , ] [

Bei jedem konvertieren der Liste in einen str um z.B. re.sub(",", "", query_sorted) anzuwenden, hole ich mir diese merkwürdigen Zeichen wieder herein...

Was ich so auf Listen anwenden kann, z.B. query_sorted.remove(",") geht auch nicht, weil die Funktion wohl nur ganze Elemente löschen kann?!?

Das ist ziemlich nervig, weil das Problem jetzt doch relativ simpel ist...ich kriegs aber nicht hin :oops:
Muss ich vielleicht eine Binärdatei erstellen, wo die Zeichenketten hineingeschrieben werden und dann FIFO ausgelesen wird? Oder gibt es da einen leichteren Weg?

Hier noch der Sourcecode

Code: Alles auswählen

def get_html_all():
    # Öffne HTML Seite BeautifulSoup
    soup = BeautifulSoup(html_all, 'html.parser')
    links_with_text = [a['href'] for a in soup.find_all('a', href=True) if a.text]
   
    # Links sortieren
    query_sorted = links_with_text
    query_sorted = str(query_sorted)
    query_sorted = list(query_sorted.split())
    query_sorted.sort()

    print(len(query_sorted))

    # Doppelte Einträge entfernen
    a = -2  
    b = -1   

    for elemente in query_sorted:
        a += 1
        b += 1
        if query_sorted[b] == query_sorted[a]:
            del query_sorted[b]
        else:
            continue
        #print(elemente)
    
    print(query_sorted)
1000 Dank für eure Ratschläge :wink:
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Stringrepräsentation von Listen ist ja auch nicht für die Weiterverarbeitung gedacht. Einfach die ganzen Umformungen weglassen. Dann tut's auch schon.

Aus einer Liste ,über die man gerade iteriert, darf man nichts löschen. Statt eine Liste zu verändern, macht man sich eine neue.
`elemente` (was eigentlich element heißen sollte) wird auch gar nicht benutzt, statt dessen gibt es zwei Indizes, die man so auch nicht benutzen sollte.
`continue` ist hier überflüssig und sollte auch sonst nicht benutzt werden.

Benutzt man ein set um doppelte Einträge zu löschen, bleibt das hier:

Code: Alles auswählen

def get_html_all():
    # Öffne HTML Seite BeautifulSoup
    soup = BeautifulSoup(html_all, 'html.parser')
    links_with_text = sorted(set(a['href'] for a in soup.find_all('a', href=True) if a.text))
    print(links_with_text)
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hi Sirius,

danke für deine Nachricht. Darf ich dich fragen, warum es unzulässig ist, aus einer Liste, die gerade iteriert wird, nichts zu löschen? Weil der Block funktioniert eigentlich gut. Die vorkommenden Dopplungen werden korrekt entfernt. Vorher ist die Länge ca. 151. Danach 131.

Die Variable "elemente" enhält alle Links aus query_sorted. Es sind summasummarum 131 Zeilen, daher habe ich bei elemente die Mehrzahl gewählt. Eigentlich ist das nur eine einfache Zählschleife.

...statt dessen gibt es zwei Indizes, die man so auch nicht benutzen sollte. Was ist denn daran genau falsch?

Die Continue kann man wahrscheinlich weg lassen, da hast du Recht.

...Die Stringrepräsentation von Listen ist ja auch nicht für die Weiterverarbeitung gedacht. Einfach die ganzen Umformungen weglassen. Dann tut's auch schon.

Naja aber was nimmt man denn dann, wenn man eine Weiterverarbeitung machen möchte? Ich muss ja die Dopplungen herausfiltern usw.

Im Grunde brauche ich halt ein Objekt mit allen Links, wie beschrieben, was ich an anderer Stelle verwenden kann. Sorry falls die Fragen sehr basic wirken, aber ich bin auch noch nicht so weit :-)
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du eine Liste veraenderst, ueber die du gerade iterierst, dann ueberspringst du Elemente, weil der Iterator dann ein Element weiter zeigt, als er darf. Damit siehst du nicht alle Elemente, und dein Algorithmus ist falsch.

Und was man nimmt ist zB das hier, wenn die Ordnung egal ist

Code: Alles auswählen

unique = set(liste)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Um das mal zu veranschaulichen:

Code: Alles auswählen

>>> xs = list(range(100, 110))
>>> xs
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
>>> for i, x in enumerate(xs):
...     print(i, ':', x)
... 
0 : 100
1 : 101
2 : 102
3 : 103
4 : 104
5 : 105
6 : 106
7 : 107
8 : 108
9 : 109
>>> for i, x in enumerate(xs):
...     print(i, ':', x)
...     del xs[i]
... 
0 : 100
1 : 102
2 : 104
3 : 106
4 : 108
>>> xs
[101, 103, 105, 107, 109]
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@m.g.o.d: `elemente` enthält eben nicht alle Elemente sondern immer nur genau *eines* aus `query_sorted`. Darum `element`. Besser wäre aber auch ein Name der besser beschreibt um was es sich handelt. Dann würde noch deutlicher auffallen, dass eine benennung in Mehrzahl hier falsch ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

m.g.o.d hat geschrieben: Montag 6. April 2020, 16:11 danke für deine Nachricht. Darf ich dich fragen, warum es unzulässig ist, aus einer Liste, die gerade iteriert wird, nichts zu löschen? Weil der Block funktioniert eigentlich gut. Die vorkommenden Dopplungen werden korrekt entfernt. Vorher ist die Länge ca. 151. Danach 131.
Inter wird für die Schleife einfach nur ein Index gemerkt, wenn man aber ein Element löscht, dann verschiebt sich alles und Du überspringst effektiv Elemente. Dass das bei Dir zu keinen Fehlern führt, dass doch noch Dopplungen dabei sind, wäre nur Zufall.
Es gibt noch andere gute Gründe, keine Listen zu verändern, weil in Python Objekte meist per Verweis übergeben werden.
m.g.o.d hat geschrieben: Montag 6. April 2020, 16:11 Die Variable "elemente" enhält alle Links aus query_sorted. Es sind summasummarum 131 Zeilen, daher habe ich bei elemente die Mehrzahl gewählt. Eigentlich ist das nur eine einfache Zählschleife.
Ja aber `elemente` enthält jeweils nur EIN Element, besser nur einen Link, wenn Du Dir mal den Inhalt ausgeben lassen hättest, wäre Dir das sofort klar geworden.
m.g.o.d hat geschrieben: Montag 6. April 2020, 16:11 ...statt dessen gibt es zwei Indizes, die man so auch nicht benutzen sollte. Was ist denn daran genau falsch?
Falsch daran ist, dass es lesbarere Möglichkeiten gibt, die weniger fehleranfällig sind.
m.g.o.d hat geschrieben: Montag 6. April 2020, 16:11 Naja aber was nimmt man denn dann, wenn man eine Weiterverarbeitung machen möchte? Ich muss ja die Dopplungen herausfiltern usw.
Wenn Du etwas mit der Liste machen willst, dann nimm die Liste und nicht die Stringrepräsentation der Liste.

Was Du statt dessen machen mußt, habe ich ja schon als Code gepostet. Wo gibt es jetzt also noch ein Problem?
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Danke für eure Antworten und Ratschläge. Ich werde es mir asap anschauen und reflektieren.

Viele Grüße,
Marc
Antworten