Web Crawler Fehler auf letzter Seite
Verfasst: Sonntag 12. August 2018, 10:39
Hallo zusammen,
ich bin mal wieder am üben und habe ein Problem mit dem Abruf einer mehrseitigen Webseite mit meinem Crawler. Hier paar Details:
ich bin mal wieder am üben und habe ein Problem mit dem Abruf einer mehrseitigen Webseite mit meinem Crawler. Hier paar Details:
- Insgesamt gibt es 6 seiten auf dem Website
- Link zu nächsten Seite ist immer unter: <a href="index.php?page=2" class="btn btn-primary">Zur nächsten Seite!</a>
- Sobald es diesen Link nicht mehr gibt, soll das Programm stoppen und die bisher gesammelten Werte ausgeben
- Diesen Fall habe ich auf unterschiedliche Weisen versucht nachzustellen
- bspw. mit while next_page is not None or "" or False
- oder while next_page.attrs["href"] is not None or "" or False
- oder noch komplett andere Ansätze wie eine If Bedingung, andere Logik etc.
- Bisher ohne Erfolg. Das Programm bricht ab, da auf der letzten Seite folgende Fehlermeldung kommt: AttributeError: 'NoneType' object has no attribute 'attrs'
- hat jemand einen Tipp, wie ich diese abfangen kann, so dass das Programm vernünfig beendet?
Code: Alles auswählen
import requests
from bs4 import BeautifulSoup
# urljoin baut weiterführende links aus reletiven pfadangaben zusammen
# angegeben muss der initiale link, wobei nur die base als root genommen wird unabhängig ob die url die erste Seite ist
# oder bereits tiefer in der Hierarchie
from urllib.parse import urljoin
# um eine Wartezeit zwischen den einzelnen Durchläufen einer Schleife zu definieren, muss Modul "tine" eingebunden werden
import time
class CrawledArticle:
def __init__(self, title, emoji, content, image):
self.title = title
self.emoji = emoji
self.content = content
self.image = image
class ArticleFetcher:
def fetch(self):
url = "http://python.beispiel.programmierenlernen.io/index.php"
next_page = "init"
while next_page is not None or "" or False:
r = requests.get(url)
doc = BeautifulSoup(r.text, "html.parser")
# für alle Elemente der Klasse "card" wird eine Schleife erzeugt
articles = []
next_page = doc.select_one(".navigation .btn-primary")
print(next_page)
for element in doc.select(".card"):
# die Klassenbezeichnung in der Schleife bezieht sich nur auf Elemente innerhalb der Schleifendefinition
# (Klasse "card" in dem Beispiel)
emoji = element.select_one(".emoji").text
content = element.select_one(".card-text").text
# mehrere span Elemente in .card-title
# mit "select" als Liste ausgeben und entsprechendes Element als Index definieren. .text nur Inhalt ausgeben
title = element.select(".card-title span")[1].text
image = urljoin(url, element.select_one("img").attrs["src"])
# Objekt mit jedem Scheifendurchlauf an Liste anhängen, wodurch man die einzelnen Ergebnisse außerhalb der
# Schleife benutzen kann
crawled = CrawledArticle(title, emoji, content, image)
articles.append(crawled)
# Außerhalb der Schleife müssen die Ergebnisse jedes Durchlaufs an eine Liste gehängt werden
# geht so nur mit jedem Schleifendurchlauf
# print(crawled.title)
url = urljoin(url, next_page.attrs["href"])
print(url)
return articles
ausgabe = ArticleFetcher()
ausgabe_liste = ausgabe.fetch()