Сохранение двух столбцов в файле csv после запуска двух отдельных циклов for - PullRequest
0 голосов
/ 29 мая 2018

У меня есть код ниже, который очищает веб-данные с помощью BeautifulSoup.Я использую два разных цикла for для захвата двух разных наборов данных: name и value

from bs4 import BeautifulSoup
import requests
import csv

source = requests.get('https://finance.yahoo.com/quote/' + ticker + '/key-statistics?p=' + ticker).text
soup = BeautifulSoup(source, 'lxml')

csv_file = open('yahoo_key_stats_grab.csv', 'w')

csv_writer = csv.writer(csv_file)
csv_writer.writerow(['name', 'value'])

def yahoo_key_stats_grab(ticker):

    for stat in soup.find_all('span')[12:21]:
        name = stat.text
        print(name)
        csv_writer.writerow([name])

    for stat in soup.find_all('td', class_='Fz(s) Fw(500) Ta(end)'):

        if len(str(stat.text)) > 6:
            break

        else:
            print(stat.text)


    csv_file.close()    

Если я запускаю код yahoo_key_stats_grab('MIC'), я получаю следующий вывод: что именноЯ хочу.

Market Cap (intraday)
Enterprise Value
Trailing P/E
Forward P/E
PEG Ratio (5 yr expected)
Price/Sales
Price/Book
Enterprise Value/Revenue
Enterprise Value/EBITDA
3.23B
6.8B
6.95
16.04
1.64
1.73
1.04
3.65
10.80

Однако я хотел бы сохранить очищенные данные в CSV-файле с двумя столбцами name и value.Я могу получить столбец имени, но не могу понять, как добавить второй столбец value в файл CSV.

name                             value

Market Cap (intraday)   

Enterprise Value    

Trailing P/E    

Forward P/E 

PEG Ratio (5 yr expected)   

Price/Sales 

Price/Book  

Enterprise Value/Revenue    

Enterprise Value/EBITDA 

Кто-нибудь может дать мне несколько советов?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Возможно, это не лучший вариант, но сработает добавление значений в список в циклах for, которые вы запускаете, а затем распечатка того, что вам нужно, используя собранные значения.Что-то вроде:

field = []
value = []
for stat in soup.find_all('span')[12:21]:
    name = stat.text
    print(name)
    field.append(name)

for stat in soup.find_all('td', class_='Fz(s) Fw(500) Ta(end)'):

    if len(str(stat.text)) > 6:
        break

    else:
        value.append(stat.text)

, затем распечатайте их с новым циклом for с csv_writer в одну строку, разделенную тем разделителем, который вы хотите для csv

0 голосов
/ 29 мая 2018

Вы можете добавить столбцы в файлы csv, передав массив в метод csv.write ().

Пример:

    import csv

    data = [["key1", "value1"], ["key2", "value2"]

    csv_file = open('testfile.csv', 'w')

    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['name', 'value'])

    for row in data:
        csv_writer.writerow(data[0], data[1])

    csv_file.close() 

Обновление: в вашем случае, поскольку у вас есть дваотличается для циклов, создающих ваши данные, вы можете сохранить первый набор данных в списке:

from bs4 import BeautifulSoup
import requests
import csv

source = requests.get('https://finance.yahoo.com/quote/' + ticker + '/key-statistics?p=' + ticker).text
soup = BeautifulSoup(source, 'lxml')

csv_file = open('yahoo_key_stats_grab.csv', 'w')

csv_writer = csv.writer(csv_file)
csv_writer.writerow(['name', 'value'])

def yahoo_key_stats_grab(ticker):
    names = []

    for stat in soup.find_all('span')[12:21]:
        names.append(stat.text)

    for stat in soup.find_all('td', class_='Fz(s) Fw(500) Ta(end)'):

        if len(str(stat.text)) > 6:
            break

        else:
            csv_writer.writerow([names.pop(0), stat.text])
            # note that this will throw an exception if there
            # are a different number of names and stats!


    csv_file.close()
...