Referenzen einer HTML-Datei 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
anaspy
User
Beiträge: 4
Registriert: Mittwoch 9. Januar 2019, 17:52

Hallo zusammen,

ich habe eine Aufgabe in der Uni bekommen und weiß einfach nicht wie ich sie lösen soll:

Sie haben eine längere Zeichenkette s. s enthält alle Zeichen einer typischen HTML-Datei. Bspw. sei s die folgende Zeichenkette:
s = ''' <html>
<body>
<a href="www.lalalala.de/abc">Link 1</a>
<a href="www.lolololol.de/123">Link 2</a>
</body>
</html>
'''
Schreiben Sie ein Programm, dass in der Zeichenkette s alle Referenzen (href=...) findet, die Inhalte ausliest und in
einer Liste r speichert. Im oben genannten Fall würde das Programm folgenden Wert für r berechnen: r = ['www.lalalala.de/abc', 'www.lolololol.de/123']


Bin Python-Anfänger und versteh einfach nicht wie das geht..

Viele Dank für eure Hilfe im Vorraus!!
Benutzeravatar
__blackjack__
User
Beiträge: 13106
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@anaspy: Da verwendet man einen HTML-Parser für und zum Beispiel eine Bibliothek wie BeautifulSoup. Damit ist das relativ einfach.

Code: Alles auswählen

In [17]: soup = bs4.BeautifulSoup(s)

In [18]: soup('a')
Out[18]: 
[<a href="www.lalalala.de/abc">Link 1</a>,
 <a href="www.lolololol.de/123">Link 2</a>]

In [19]: [node.get('href') for node in soup('a')]
Out[19]: ['www.lalalala.de/abc', 'www.lolololol.de/123']
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
anaspy
User
Beiträge: 4
Registriert: Mittwoch 9. Januar 2019, 17:52

__blackjack__ hat geschrieben: Mittwoch 9. Januar 2019, 18:27 @anaspy: Da verwendet man einen HTML-Parser für und zum Beispiel eine Bibliothek wie BeautifulSoup. Damit ist das relativ einfach.

Code: Alles auswählen

In [17]: soup = bs4.BeautifulSoup(s)

In [18]: soup('a')
Out[18]: 
[<a href="www.lalalala.de/abc">Link 1</a>,
 <a href="www.lolololol.de/123">Link 2</a>]

In [19]: [node.get('href') for node in soup('a')]
Out[19]: ['www.lalalala.de/abc', 'www.lolololol.de/123']

Und wenn ich so etwas nicht verwende? Sondern "reinen" Code schreiben möchte?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann mußt Du einen HTML-Parser nachprogrammieren, die Syntax findest Du zum Beispiel unter https://www.w3.org/TR/html52/syntax.html#syntax .
anaspy
User
Beiträge: 4
Registriert: Mittwoch 9. Januar 2019, 17:52

Sirius3 hat geschrieben: Mittwoch 9. Januar 2019, 18:44 Dann mußt Du einen HTML-Parser nachprogrammieren, die Syntax findest Du zum Beispiel unter https://www.w3.org/TR/html52/syntax.html#syntax .
okay und da gibt es keinen einfacheren Weg? Weil so weit sind wir in der Uni eigentlich noch gar nicht
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast HTML gegeben und sollst daraus etwas lesen, so ist der erste Schritt das HTML zu parsen. Dafür gibt es fertige Module, weil das niemand selbst programmieren will. Der einfache Weg ist also, das passende Modul dafür zu benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 13106
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@anaspy: Was war denn daran jetzt ”unrein”? Da ist kein Schweinefleisch drin und schmutzige Worte auch nicht. ;-)

Und nein einen einfacheren Weg gibt es nicht. Ich vermute mal der Dozent/Aufgabensteller macht es sich hier zu einfach und würde auch sehr kaputte Lösungen akzeptieren die nur mit einer Untermenge an HTML-Dokumenten funktioniert und nicht mit jedem. Dann wäre es allerdings wieder ganz einfach, denn dann brauchst Du einfach nur ein paar Methoden auf Zeichenketten. Dazu gibt's was in dem Tutorial in der Python-Dokumentation und in den Abschnitten über Sequenztypen allgemein und Zeichenketten im Besonderen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
anaspy
User
Beiträge: 4
Registriert: Mittwoch 9. Januar 2019, 17:52

__blackjack__ hat geschrieben: Mittwoch 9. Januar 2019, 19:15 @anaspy: Was war denn daran jetzt ”unrein”? Da ist kein Schweinefleisch drin und schmutzige Worte auch nicht. ;-)

Ich meine mit "reiner" Code, dass ich etwas in z.B. Spyder eingebe und dann direkt das geforderte Ergebnis raus bekommen hahaah, sorry kenne mich echt noch nicht so gut aus.

Hätte gedacht, dass man z.B. einen Code schreiben kann, der alles zwischen "href=" und ">Link" ausgibt, da so Referenzen meistens geschrieben werden. Finde dazu aber leider nichts hilfreiches im Internet.
Benutzeravatar
__blackjack__
User
Beiträge: 13106
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@anaspy: Solchen Code kann man schreiben. Wie schon gesagt, da muss man nur ein paar Grundlagen passend kombinieren. Das nennt sich „programmieren“. :-) Möglichst fertige Lösungen im Internet suchen bringt einen auf Dauer nicht weiter. Du musst Schleifen verstehen und schauen was an Zeichenkettenmethoden und -verhalten bezüglich Syntax hier nützlich ist. Ich nehme mal an genau das ist der Sinn dieser Aufgabe. Nicht den Umgang mit Suchmaschinen lernen, sondern Dokumentation lesen und verstehen und das gelernte anwenden.

Das Problem mit so einem Ansatz, HTML nicht richtig mit einem Parser zu verarbeiten, ist dann zum Beispiel das `href` nicht nur in <a>-Elementen stehen kann, das vor und nach dem Gleichheitszeichen Leerzeichen und/oder Zeilenumbrüche stehen dürfen, das in HTML aus der freien Wildbahn neben doppelten Anführungszeichen um die URL auch einzelne oder gar keine vorkommen können, das `href` nicht das einzige/letzte Attribut in einem <a>-Element sein muss, …
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten