Ich bin ein Absatz!
\n", "Ich bin noch ein Absatz
\n", " \n", " \n", "\"\"\"\n", "\n", "doc = BeautifulSoup(htmlDatei, \"html.parser\") # HTML-Datei mit BeautifulSoup Parsen/Einlesen\n", "\n", "for p in doc.find_all(\"p\"): # im Dokument alle-Konstruktoren finden\n", " print(p.attrs) # für alle
dessen Attribute ausgeben\n", " print(p.text) # für alle
dessen Text ausgeben"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### relative URLs\n",
"Einige Elemente (z.B. Bilder) sind auf Webseiten nur relativ zu Ihrer Webseite verlinkt. Beim Crawlen kann der gesamte Bildpfad mit **urljoin** hergestellt werden."
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"relative URL: ./img/1.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/1.jpg\n",
"relative URL: ./img/2.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/2.jpg\n",
"relative URL: ./img/3.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/3.jpg\n",
"relative URL: ./img/4.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/4.jpg\n",
"relative URL: ./img/5.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/5.jpg\n",
"relative URL: ./img/6.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/6.jpg\n",
"relative URL: ./img/7.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/7.jpg\n"
]
}
],
"source": [
"from urllib.parse import urljoin # urljoin importieren\n",
"from bs4 import BeautifulSoup # BeautifulSoup importieren\n",
"\n",
"url = \"http://python.beispiel.programmierenlernen.io/index.php\" #Webseiten-URL die durchsucht wurde\n",
"\n",
"r = requests.get(url)\n",
"doc = BeautifulSoup(r.text, \"html.parser\") # HTML-Datei mit BeautifulSoup Parsen/Einlesen\n",
" \n",
"for card in doc.select(\".card\"):\n",
" image = card.select_one(\"img\").attrs[\"src\"]\n",
" imageURL = urljoin(url, image)\n",
" print(\"relative URL: \" + image + \" gesamte URL: \" + imageURL)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 9. Generatoren\n",
"Generatoren erzeugen Listen (meist aus Crawlern) die viele Einträge enthält. Aus dieser Liste können eine bestimmte Anzahl an Einträgen ausgegeben werden. Die **.fetch()**-Methode erkennt dies dadurch automatisch."
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"gen: 0\n",
"for: 0\n",
"gen: 1\n",
"for: 1\n",
"gen: 2\n",
"for: 2\n",
"####\n",
"gen: 0\n",
"for: 0\n",
"gen: 1\n"
]
}
],
"source": [
"def gen_generator():\n",
" for i in range(0, 3):\n",
" print(\"gen: \" + str(i))\n",
" yield i\n",
"\n",
"for element in gen_generator(): # Alle Elemente der Liste ausgeben\n",
" print(\"for: \" + str(element))\n",
"\n",
"print(\"####\")\n",
"\n",
"for element in gen_generator(): # die ersten 2 Elemente ausgeben\n",
" if element == 1:\n",
" break\n",
" print(\"for: \" + str(element))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 10. Objektorientierung\n",
"Klassen sind Baupläne für Objekte. Die erzeugten Objekte nennt man Instanzen dieser Klasse."
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Erik\n"
]
}
],
"source": [
"class Student(): # Klasse Student erstellen, Klassennamen beginnen gemäß Konvention mit Großbuchstaben\n",
" pass # Leere Klasse zulassen\n",
"\n",
"erik = Student() # Instanz erzeugen\n",
"erik.firstname = \"Erik\" # zwei Variablen für das Objekt,\n",
"erik.lastname = \"Mustermann\" # auf díe über das Objekt per Punktschreibweise zugegriffen werden kann\n",
"\n",
"print(erik.firstname) "
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mueller\n"
]
}
],
"source": [
"class Student(): \n",
" def __init__(self, firstname, lastname): # durch Definition der Variablen mittel einer Methode\n",
" self.firstname = firstname # können Instanzen einfach hinzugefügt werden\n",
" self.lastname = lastname\n",
"\n",
"monika = Student(\"Monika\", \"Mueller\") # Kurzschreibweise für Instanz\n",
"\n",
"print(monika.lastname)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Methoden und Definitionen können innerhalb von Objekten gebildet werden um Namensübertretungen zu verhindern bzw. \n",
"innerhalb eines Objekts alle Namenskonventionen festzuhalten.
\n",
"**self** ist ein Schlüsselwort, es fungiert gewissermassen als Platzhalter für die jeweilige Instanz"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Erik Mustermann\n"
]
}
],
"source": [
"class Student():\n",
" def name(self): # ein Konstruktor, der eine Funktion für das Objekt definiert\n",
" print(self.firstname + \" \" + self.lastname)\n",
"\n",
"erik = Student() \n",
"erik.firstname = \"Erik\" \n",
"erik.lastname = \"Mustermann\"\n",
"erik.name() "
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Erik Mustermann (Semester: 1)\n",
"Erik Mustermann (Semester: 2)\n"
]
}
],
"source": [
"class Student():\n",
" def __init__(self, firstname, lastname):\n",
" self.firstname = firstname\n",
" self.lastname = lastname\n",
" self.term = 1 # Hier initialisiert die neue Variable term (Eigenschaft)\n",
" \n",
" def increase_term(self): # Mit dieser Methode erhöht die Variable term um 1\n",
" self.term = self.term + 1\n",
" \n",
" def name(self): # name() gibt Name und Anzahl der Semester aus\n",
" print(self.firstname + \" \" + self.lastname + \n",
" \" (Semester: \" + str(self.term) + \")\")\n",
" \n",
"erik = Student(\"Erik\", \"Mustermann\")\n",
"erik.name()\n",
"erik.increase_term() #Semester erhöhen\n",
"erik.name()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Private Eigenschaften und Methoden\n",
"Private Eigenschaften erlauben sauberes Kapseln von Eigenschaften und Methoden. Dadurch können Variablen und Methoden vor außerhalb geschützt werden. Wichtig wenn diese Variablen / Methoden noch angeüasst werden.
\n",
"Mit **zwei Unterstrichen** vor der Variable wird diese **privat**. Methoden könne auf dieselbe Weise eingeschränkt werden."
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
"class Student():\n",
" def increase_term(self):\n",
" self.__term = self.__term + 1\n",
" \n",
" def get_term(self): # um von außen noch auf die Variable term zugreifen zu können\n",
" return self.__term\n",
" \n",
" def __do_something(self):\n",
" print(\"doSomething\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Vererbung\n",
"Durch Vererbung können Daten aufgeteilt und besser modelliert werden.
\n",
"Als Parameter wird die Klasse übergeben, von der neue Eigenschaften und Methoden vererbt werden sollen (Mutterklasse)."
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"class WorkingStudent(Student):\n",
" \n",
" def __init__(self, firstname, surname, company): \n",
" # mit super() wird Python gezeigt, dass die init()-Methode der Mutterklasse angewendet werden soll\n",
" super().__init__(firstname, surname)\n",
" self.company = company\n",
" \n",
" def name(self):\n",
" return super().name() + \" (\" + self.company + \")\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Die type() und isinstance() Funktionen\n",
"Mit der **type()**-Funktion kann der Typ eines Objektes festgestellt werden.
\n",
"Die Funktion **isinstance()** erhält zwei Parameter: die **Variable** und die **Klasse** bezüglich derer auf Zugehörigkeit der Variable geprüft werden soll. **isinstance()** liefert einen Bool zurück."
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"
\n",
"Die repr-Methode gibt für **Objekt** eine Definierte Form aus.
\n",
"Die len-Methode gibt für **print(len(Objekt))** die Länge aus.\n"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"PhoneBook({'Mustermann': '1234', 'Mueller': '9876'})\n",
"2\n"
]
}
],
"source": [
"class PhoneBook():\n",
" def __init__(self):\n",
" self.__entries = {}\n",
" def add(self, name, phone_number):\n",
" self.__entries[name] = phone_number\n",
" def get(self, name):\n",
" if name in self.__entries:\n",
" return self.__entries[name]\n",
" else:\n",
" return None\n",
" def __str__(self):\n",
" return \"PhoneBook(\" + str(self.__entries) + \")\"\n",
" def __repr__(self):\n",
" return \"PhoneBook(\" + str(self.__entries) + \")\"\n",
" def __len__(self):\n",
" return len(self.__entries)\n",
"\n",
"book = PhoneBook()\n",
"book.add(\"Mustermann\", \"1234\")\n",
"book.add(\"Mueller\", \"9876\")\n",
"\n",
"print(book) #für str-Funktion\n",
"book #für repr-Funktion\n",
"print(len(book)) # für len-Funktion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 11. Exceptions\n",
"Während der Laufzeit eines Programms können Fehler auftreten. Damit das Programm dadurch nicht abgebrochen wird, kann man mit Exceptions (**try:** und **except:** Blöcke) arbeiten. Ein Code kann mehrere **except**-Blöcke enthalten. Es können auch eigene Fehlercodes programmiert werden.
\n",
"Fehlercodes sollten nur in den seltensten Fällen benutzt werden!"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Durch null teilen ist nicht erlaubt!\n",
"5\n"
]
}
],
"source": [
"try:\n",
" print(5 / 0) # durch Null teilen ist nicht definiert -> Fehler\n",
" print(4) # alles nach dem Fehler wird nicht ausgeführt\n",
"except ZeroDivisionError: # tritt ein bestimmter Fehler auf wird der except-Block asugeführt\n",
" print(\"Durch null teilen ist nicht erlaubt!\")\n",
"print(5) # alles nach dem except Block wird wieder ausgeführt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Eigene Fehler auslösen\n",
"Über den **raise**-Befehl können eigene Fehler ausgelöst werden."
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bitte gebe eine gültige E-Mail ein\n"
]
}
],
"source": [
"class InvalidEmailError(Exception):\n",
" pass\n",
"\n",
"def send_mail(email, subject, content):\n",
" if not \"@\" in email:\n",
" raise InvalidEmailError(\"email does not contain an @\")\n",
"try: \n",
" send_mail(\"hallo\", \"Betreff\", \"Inhalt\")\n",
"except InvalidEmailError:\n",
" print(\"Bitte gebe eine gültige E-Mail ein\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Code abschließen\n",
"Der **finally**-Befehl wird bei jedem Programmdurchlauf ausgeführt, auch wenn zuvor Fehler aufgetreten sind."
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Durch null teilen ist nicht erlaubt!\n",
"Schluss\n"
]
}
],
"source": [
"try:\n",
" print(5 / 0)\n",
"except ZeroDivisionError:\n",
" print(\"Durch null teilen ist nicht erlaubt!\")\n",
"finally:\n",
" print(\"Schluss\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}