soup.find

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Bykl
User
Beiträge: 103
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: 14299
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()
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Bykl
User
Beiträge: 103
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: 4633
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: 103
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