Python Python, CSV-File, Schwierigkeiten beim sortieren

SDsda

Cadet 2nd Year
Registriert
Nov. 2019
Beiträge
16
Hey, ich habe gerade eine csv.file und frage mich, wie ich den Inhalt nach meinen Vorstellungen sortieren kann.
Zunächst einmal der Code:

Python:
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import operator

urls = ["1",
               "2"]
for url in urls:
    response = urlopen(urls)
    page = soup(response, 'lxml')
    table = page.find_all('table', class_='ernaehrung')[0]
    rows = table.find_all('tr')
    with open('2233.csv', 'a', newline='') as csvfile:
        writer = csv.writer(csvfile)
        try:
            for row in rows:
                csvRow = []
                for cell in row.find_all(['td', 'th']):
                    csvRow.append(cell.get_text())
                writer.writerow(csvRow)
        finally:
            csvfile.close()

Das Ergebnis ist:

Code:
Obst    Nährwert_1
Apfel    1
Birne     2
Banane    3
Obst    Nährwert_2
Apfel    1
Banane     9
Birne    3

Welche Änderungen müssen getroffen werden, damit meine Tabelle wie folgt aussieht?:

Code:
Obst        Nährwert_1        Nährwert_2
Apfel        1                1
Birne         2                3
Banane        3                9

Viele Grüße
 
Programmieranfänger Idee:
Wäre es nicht möglich, mithilfe eines Dictionaries die einzelnen Reihen zu füllen?
Du nimmst als Key den ersten Eintrag der gefunden wird und an den Value hängst du dann immer das gefundene als String an?

S.d. du 2x den Key "Obst" findest, den du dann den Values "Nährwert_1, Nährwert_2" zuordnest.
Das dann entsprechend formatiert ließe sich dann in eine CSV umschreiben.

Oder denke ich zu kompliziert bzw falsch und es geht so gar nicht?
 
Man könnte auch noch zwischen den HTML-Tags "th" (table header) und "td" (table data) unterscheiden, um festzustellen, was die Spaltenüberschriften und was die Attributsausprägungen sind. Ein Beispiel der Quell-Website wäre hilfreich.
 
du hast doch gar keine CSV Datei, du erstellst doch eine? Dein Input ist HTML so wie es aussieht?
Warum kannst du jetzt nicht einfach nach den Zeilen suchen, die du als Header ansiehst? Mit Glueck ueber die HTML tags, ansonsten musst du wohl hard-codieren oder nach Spalten-Wert (keine Zahl etc.) mal unterscheiden
 
abcddcba schrieb:
du hast doch gar keine CSV Datei, du erstellst doch eine? Dein Input ist HTML so wie es aussieht?
Warum kannst du jetzt nicht einfach nach den Zeilen suchen, die du als Header ansiehst? Mit Glueck ueber die HTML tags, ansonsten musst du wohl hard-codieren oder nach Spalten-Wert (keine Zahl etc.) mal unterscheiden

Doch, die 2233.csv, siehe "Das Ergebnis ist:"
Ergänzung ()

Bonanca schrieb:
Programmieranfänger Idee:
Wäre es nicht möglich, mithilfe eines Dictionaries die einzelnen Reihen zu füllen?
Du nimmst als Key den ersten Eintrag der gefunden wird und an den Value hängst du dann immer das gefundene als String an?

S.d. du 2x den Key "Obst" findest, den du dann den Values "Nährwert_1, Nährwert_2" zuordnest.
Das dann entsprechend formatiert ließe sich dann in eine CSV umschreiben.

Oder denke ich zu kompliziert bzw falsch und es geht so gar nicht?

Klingt soweit gut, nur ist mir die Umsetzung nicht möglich.
Ergänzung ()

naniii schrieb:
Ich mache so Sachen nur mit dem Pandas package.

Das wäre auch möglich. Wenn ich mein Problem auf pandas übertrage, dann finde ich auch keine Lösung.
 
SDsda schrieb:
Doch, die 2233.csv, siehe "Das Ergebnis ist:"
Er meinte damit, dass du ja beim Anfang noch keine hast.
Die Daten liegen in HTML vor, du versuchst ja eben eine CSV Datei zu erstellen (bzw zu erweitern.)
Das meinte abcddcba.
 
  • Gefällt mir
Reaktionen: abcddcba
gschulde schrieb:
Man könnte auch noch zwischen den HTML-Tags "th" (table header) und "td" (table data) unterscheiden, um festzustellen, was die Spaltenüberschriften und was die Attributsausprägungen sind. Ein Beispiel der Quell-Website wäre hilfreich.
Hier:


Python:
url 1:
<table class="ernaehrung">
    <thead>
        <tr class= "A">[...]</tr>
            <th class= "A-1" </th>
                <div class="Obst" </div>
                <div class="Nährwerte_1" </div>
            </th>
    </thead>
    <tbody>
        <tr class"Obst"></tr>
            <td class= "Apfel" > </td>
            <td class= "Birne" > </td>
            <td class= "Banane" > </td>
        <tr class"Nährwerte_1"></tr>
            <td class= "1" > </td>
            <td class= "2" > </td>
            <td class= "3" > </td>
</table>

url2:
<table class="ernaehrung">
    <thead>
        <tr class= "A">[...]</tr>
            <th class= "A-2" </th>
                <div class="Obst" </div>
                <div class="Nährwerte_2" </div>
            </th>
    </thead>
    <tbody>
        <tr class"Obst"></tr>
            <td class= "Apfel" > </td>
            <td class= "Banane" > </td>
            <td class= "Birne" > </td>
        <tr class"Nährwerte_1"></tr>
            <td class= "1" > </td>
            <td class= "9" > </td>
            <td class= "3" > </td>
</table>
 
Zuletzt bearbeitet:
Ok, aber das sind ja 2 HTML Tabellen als Input. Wenn du faul bist, nimm 2 Pandas Dataframes df1, df2 und mach ein pd.merge(df1, df2, on='Obst')

Pandas kann übrigens direkt die HTML Tabellen parsen, deshalb auch mein Vorschlag.
 
Gibts auch eine Lösung, wenn ich nur 1 Pandas Dataframe zur Verfügung habe ?
Ergänzung ()

Habe eine Lösung mit Pandas gefunden
 
Zuletzt bearbeitet:
Zurück
Oben