Werte aus PHPfeed auslesen und in CSV datei schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alfer
User
Beiträge: 8
Registriert: Samstag 16. Oktober 2021, 16:54

Hallo,

ich möchte aus dieser url

https://de.marketscreener.com/reuters_c ... s&iLang=3
die Daten auslesen und in eine csv datei schreiben.

Wenn ich diesen code benutze:

Code: Alles auswählen

import requests
import bs4
import csv
from csv import writer

url = "https://de.marketscreener.com/reuters_charts/afDataFeed.php?codeZB=44211922&t=dcons&iLang=3"    
response = requests.get(url)
soup = bs4.BeautifulSoup(response.content, "html.parser")

with open("C:/analysten_data.csv", "w", encoding="utf-8", newline="") as csv_file:
        writer = csv.writer(csv_file, delimiter=";")
        writer.writerow(soup)
Schreibt python mir das:
[[{"name":"Kaufen","y":9,"color":"#009900"},{"name":"Aufstocken","y":7,"color":"#00CC00"},{"name":"Halten","y":6,"color":"#EEF200"},{"name":"Reduzieren","y":2,"color":"#FFAE00"},{"name":"Verkaufen","y":3,"color":"#FF0000"},{"name":"Ohne Meinung","y":0,"color":"#434343"}],["Kaufen","Aufstocken","Halten","Reduzieren","Verkaufen","Ohne Meinung"],"",true]
Ich will aber nur die Zahlen extrahieren, also müsste es so aussehen:
9;7;6;2;3;0
Jemand eine Idee wie ich das hinbekomme?
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum gehst du auf einen JSON-String mit BeautifulSoup los?
Da benutzt man response.json() und bearbeitet diese wie jede andere Pythonstruktur auch.
alfer
User
Beiträge: 8
Registriert: Samstag 16. Oktober 2021, 16:54

Danke erstmal für deine Antwordt. Json hatte ich probiert, bekam aber ständig eine Fehlermeldung. Dank deines Hinweisses hab ich nochmal genauer recheriert.

Code: Alles auswählen

import requests
import json

url = "https://de.marketscreener.com/reuters_charts/afDataFeed.php?codeZB=44211922&t=dcons&iLang=3"
response = requests.get(url)

soup = response.json()

print(soup)
Mit response.json() gibt er mir das wieder:

Code: Alles auswählen

[[{'name': 'Kaufen', 'y': 9, 'color': '#009900'}, {'name': 'Aufstocken', 'y': 7, 'color': '#00CC00'}, {'name': 'Halten', 'y': 6, 'color': '#EEF200'}, {'name': 'Reduzieren', 'y': 2, 'color': '#FFAE00'}, {'name': 'Verkaufen', 'y': 3, 'color': '#FF0000'}, {'name': 'Ohne Meinung', 'y': 0, 'color': '#434343'}], ['Kaufen', 'Aufstocken', 'Halten', 'Reduzieren', 'Verkaufen', 'Ohne Meinung'], '', True]
Dann bekomme ich aber diese Fehlermeldung auf https://jsonformatter.org/:

Code: Alles auswählen

Parse error on line 1:
[[{'name': 'Kaufen', 'y
---^
Expecting 'STRING', '}', got 'undefined'
Mit bs4 bekomme ich zumindest keine Fehlermeldung auf jsonformatter

Code: Alles auswählen

import requests
import bs4
import csv
from csv import writer

url = "https://de.marketscreener.com/reuters_charts/afDataFeed.php?codeZB=44211922&t=dcons&iLang=3"    
r = requests.get(url)
soup = bs4.BeautifulSoup(response.content, "html.parser")

print(soup)
Allerdings, stimmt die Reihenfolge dann nicht mehr. Der ideale jsoncode sieht auf jsonmatter so aus:

Code: Alles auswählen

  [{"name":"Kaufen","y":9,"color":"#009900"},{"name":"Aufstocken","y":7,"color":"#00CC00"},{"name":"Halten","y":6,"color":"#EEF200"},{"name":"Reduzieren","y":2,"color":"#FFAE00"},{"name":"Verkaufen","y":3,"color":"#FF0000"},{"name":"Ohne Meinung","y":0,"color":"#434343"}]   
Damit bekomme ich genau die CSV die ich gerne möchte:

Code: Alles auswählen

name,y,color
Kaufen,9,#009900
Aufstocken,7,#00CC00
Halten,6,#EEF200
Reduzieren,2,#FFAE00
Verkaufen,3,#FF0000
Ohne Meinung,0,#434343
Nur schaffe ich es leider nicht dies in Python so hin zu bekommen... da ich die url variable machen will, ist es zuviel aufwand alles mit der Hand zu editieren.
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Was willst Du denn mit https://jsonformatter.org/?
Du mußt doch nur das richtige Wörterbuch aus der Struktur herausholen und mit csv.Dictwriter hast Du dann auch schon Dein gewünschtes csv-Format.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@alfer,

die gewünschten Daten liegen in einer Liste aus Dictionaries, die wieder in einer Liste liegt. Das ist etwas merkwürdig, aber kein Problem. Wenn du mit JSON arbeitest, brauchst du aber BeautifulSoup nicht mehr. Das ist doch wesentlich angenehmer.

Code: Alles auswählen

import requests
import csv

url = "https://de.marketscreener.com/reuters_charts/afDataFeed.php?codeZB=44211922&t=dcons&iLang=3"
response = requests.get(url)
data = response.json()


with open("C:\analysten_data.csv", "w", encoding="utf-8", newline="") as csv_file:
    writer = csv.writer(csv_file, delimiter=";")
    writer.writerow(["name", "y", "color"])
    for row in data[0]:
        writer.writerow(row.values())


"""
csv-Datei:

name;y;color
Kaufen;9;#009900
Aufstocken;7;#00CC00
Halten;6;#EEF200
Reduzieren;2;#FFAE00
Verkaufen;3;#FF0000
Ohne Meinung;0;#434343
"""
Edit:
Die von Sirius3 erwähnte DictWriter Methode:

Code: Alles auswählen

with open("C:\analysten_data.csv", "w", encoding="utf-8", newline="") as csv_file:
    fieldnames = ["name", "y", "color"]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=";")
    writer.writeheader()
    for row in data[0]:
        writer.writerow(row)
Zuletzt geändert von rogerb am Freitag 29. Oktober 2021, 18:21, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: wie ich schon schrieb, ist DictWriter das richtige. Du berücksichtigst die Schlüssel gar nicht, und hoffst, dass die Werte in der richtigen Reihenfolge kommen.

Code: Alles auswählen

import requests
import csv

url = "https://de.marketscreener.com/reuters_charts/afDataFeed.php?codeZB=44211922&t=dcons&iLang=3"
response = requests.get(url)
data = response.json()

with open("C:/analysten_data.csv", "w", encoding="utf-8", newline="") as csv_file:
    writer = csv.DictWriter(csv_file, ["name", "y", "color"], delimiter=";")
    writer.writeheader()
    writer.writerows(data[0])
Zuletzt geändert von Sirius3 am Freitag 29. Oktober 2021, 18:24, insgesamt 1-mal geändert.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Sirius3, völlig richtig, hat sich jetzt etwas überschnitten...
alfer
User
Beiträge: 8
Registriert: Samstag 16. Oktober 2021, 16:54

Vielen Dank funktioniert wunderbar, schönes Wochende wünsche ich euch!!!
Antworten