soup.find

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

Hallo,

ich möchte mal was aus dem netz zusammensuchen und hab das aus Ausgangsmaterial:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
import pandas as pd

# URL der Wikipedia-Seite mit den Hauptstädten in Europa
url = "https://de.wikipedia.org/wiki/Liste_der_Hauptst%C3%A4dte_in_Europa"

# Anfrage an die URL senden und Antwort erhalten
response = requests.get(url)

# BeautifulSoup-Objekt aus der HTML-Antwort erstellen
soup = BeautifulSoup(response.content, "html.parser")

# Extrahieren der Namen der Hauptstädte
city_names = []
table = soup.find("table", {"class": "wikitable sortable"})
rows = table.find_all("tr")
for row in rows[1:21]:
    cells = row.find_all("td")
    city_name = cells[1].find("a").text
    city_names.append(city_name)

# Schreiben der Daten in eine Excel-Datei
df = pd.DataFrame(city_names, columns=["Hauptstadt"])
df.to_excel("Wikiresarch.xlsx", index=False)
Ich bekomme in Spider aber immer die Antwort: rows = table.find_all("tr")

AttributeError: 'NoneType' object has no attribute 'find_all'

Ich deute das, ds er die Hauptstadtnamen nicht findet. Die Suche findet in Zeile Table=soup.find ... statt.

Auf der Wikiseite steht aber nicht class="wikitable sortable" sondern class="wikitable sortable zebra"

Was soll das Zebra an der Stelle? Was muss ich machen, damit es flutscht...?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Die Webseite gibt es nicht, die heisst geringfügig anders. Darum ist es immer eine gute Idee `response.raise_for_status()` aufzurufen, denn Dein Code wertet die 404 Fehlerseite aus, die bei Wikipedia gar keine Tabelle enthält und damit auch die CSS-Klassen völlig egal sind.

`zebra` ist eine CSS-Klasse. Ich vermute mal die ist dafür verantwortlich das jede zweite Zeile in der Tabelle eine andere Farbe hat. Gestreift halt.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd
import requests
from bs4 import BeautifulSoup


def main():
    response = requests.get(
        "https://de.wikipedia.org/wiki/Liste_der_Hauptstädte_Europas",
        timeout=None,
    )
    response.raise_for_status()

    city_names = [
        row.find("td").find("a").text
        for row in (
            BeautifulSoup(response.content, "html.parser")
            .find("table", "wikitable")
            .find_all("tr")[1:]
        )
    ]

    pd.DataFrame(city_names, columns=["Hauptstadt"]).to_excel(
        "Wikiresearch.xlsx", index=False
    )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

DankeBlackjack, das scheint zu gehen. Er gibt aber das aus:

Code: Alles auswählen

runfile('/Users/Desktop/ProjLaura/PythonProgr/Wikiresarch.py', wdir='/Users/ottoreincke/Desktop/ProjLaura/PythonProgr')
Traceback (most recent call last):

  File "<ipython-input-64-631294fa64e8>", line 1, in <module>
    runfile('/Users/Desktop/ProjLaura/PythonProgr/Wikiresarch.py', wdir='/Users/ottoreincke/Desktop/ProjLaura/PythonProgr')

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/Users/Desktop/ProjLaura/PythonProgr/Wikiresarch.py", line 54, in <module>
    df.to_excel("/Schreibtisch/ProjLaura/Exceldat/Hauptstädte.xlsx", index=False)

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 2256, in to_excel
    engine=engine,

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/pandas/io/formats/excel.py", line 742, in write
    writer.save()

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/pandas/io/excel/_xlsxwriter.py", line 195, in save
    return self.book.close()

  File "/Users/opt/anaconda3/lib/python3.7/site-packages/xlsxwriter/workbook.py", line 313, in close
    raise FileCreateError(e)

FileCreateError: [Errno 2] No such file or directory: '/Schreibtisch/ProjLaura/Exceldat/Hauptstädte.xlsx'
Die Datei "Hauptstädte.xlsx" hab ich angelegt, und sie existiert in dem Verzeichnis. Was tun?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Es gibt ein Verzeichnis /Schreibtisch auf deinem System? Das kommt mir seltsam vor.
Dein Projekt liegt in `/Users/Desktop/ProjLaura`
Und dann gibt es zusätzlich noch ein Verzeichnis `/Schreibtisch/ProjLaura/`?
Bykl
User
Beiträge: 93
Registriert: Donnerstag 5. Oktober 2017, 17:57

Ja, Danke nochmal ich habs jetzt, allerdings, wenn man in Deinen Befehl:

Code: Alles auswählen

pd.DataFrame(city_names, columns=["Hauptstadt"]).to_excel(
        "Schreibtisch/ProjLaura/Exceldat/Wikiresearch.xlsx", index=False
    )
einen Pfad vor die Datei einfügt, streikt er, und es kommt:

Code: Alles auswählen

FileCreateError: [Errno 2] No such file or directory: 'Schreibtisch/ProjLaura/Exceldat/Wikiresearch.xlsx'
obwohl es den Ort gibt ....
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

Geht' hier um Windows?
"Schreibtisch/ProjLaura/Exceldat/Wikiresearch.xlsx" kann doch kein Pfad sein der wirklich existiert?

Vielleicht eher etwas in der Art /Users/Desktop/ProjLaura/Exceldat/Wikiresearch.xlsx
OS: LMDE5 *** Homepage *** Github Seite
Antworten