Как записать вывод панд в несколько строк? - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать скребок с помощью Selenium, а затем записать данные в файл CSV. Каждый раз, когда я запускаю приведенный ниже скрипт, он создает файл data.csv, но выходные данные перезаписываются в одну и ту же строку снова и снова, в результате чего получается только одна строка.

Как записать выходные данные в отдельные строки?

import pandas as pd

elem = driver.find_elements_by_class_name("product-listing-row")
for ii in elem:
    pname = ii.find_element_by_class_name('product-name').text
    print('pname: ' + pname)
    psku = ii.find_element_by_class_name('product-code').text
    print('psku: ' + psku)
    thumb = ii.find_element_by_class_name('scaleAll').get_attribute('src')
    print('thumb: ' + thumb)
    link = ii.find_element_by_css_selector('a').get_attribute('href')
    print('address: ' + link)
    raw_data = {'Product_Name': [pname],
        'Product_SKU': [psku],
        'Product_ImageURL': [thumb],
        'Product _URL': [link]}
    df = pd.DataFrame(raw_data, columns = ['Product_Name', 'Product_SKU', 'Product_ImageURL', 'Product _URL'])
    df.to_csv (r'/Users/reezalaq/PycharmProjects/wholesale/data.csv')

Ответы [ 4 ]

0 голосов
/ 06 октября 2019

Вы должны добавить каждый элемент в список.

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

import pandas as pd

    raw_data = []
    for i in range(1,10):
        element = {'item': i }
        raw_data.append(element)

    df = pd.DataFrame(raw_data, columns = ['item'])
    df.to_csv ('./data.csv')
0 голосов
/ 06 октября 2019

изменить на df.to_csv(r'/Users/reezalaq/PycharmProjects/wholesale/data.csv', mode='a', header=False)

0 голосов
/ 06 октября 2019

Проблема здесь:

raw_data = {'Product_Name': [pname],
    'Product_SKU': [psku],
    'Product_ImageURL': [thumb],
    'Product _URL': [link]}

для каждого elem, вы перезаписываете raw_data. Вместо этого вы можете сделать что-то вроде этого:

#initialize a list for your data
raw_data = []
for ii in elem:
    pname = ii.find_element_by_class_name('product-name').text
    print('pname: ' + pname)
    psku = ii.find_element_by_class_name('product-code').text
    print('psku: ' + psku)
    thumb = ii.find_element_by_class_name('scaleAll').get_attribute('src')
    print('thumb: ' + thumb)
    link = ii.find_element_by_css_selector('a').get_attribute('href')
    print('address: ' + link)
    raw_data_elem = {'Product_Name': pname,
        'Product_SKU': psku,
        'Product_ImageURL': thumb,
        'Product _URL': link}
    #add row to list
    raw_data.append(raw_data_elem)
df = pd.DataFrame(raw_data, columns = ['Product_Name', 'Product_SKU',   
        'Product_ImageURL', 'Product _URL'])
df.to_csv (r'/Users/reezalaq/PycharmProjects/wholesale/data.csv')
0 голосов
/ 06 октября 2019

Вам нужно записать его в режиме append:

import pandas as pd

elem = driver.find_elements_by_class_name("product-listing-row")
header = True
for ii in elem:
    pname = ii.find_element_by_class_name('product-name').text
    psku = ii.find_element_by_class_name('product-code').text
    thumb = ii.find_element_by_class_name('scaleAll').get_attribute('src')
    link = ii.find_element_by_css_selector('a').get_attribute('href')
    raw_data = {'Product_Name': [pname],
        'Product_SKU': [psku],
        'Product_ImageURL': [thumb],
        'Product _URL': [link]}
    df = pd.DataFrame(raw_data, columns = ['Product_Name', 'Product_SKU', 'Product_ImageURL', 'Product _URL'])
    df.to_csv (r'/Users/reezalaq/PycharmProjects/wholesale/data.csv', mode="a", header=header)
    header = False

Это добавит заголовок к вашему csv только на первой итерации, а затем добавит все новые строки вфайл.

В качестве альтернативы, вы можете сделать DataFrame один раз, а затем сохранить его:

import pandas as pd

elem = driver.find_elements_by_class_name("product-listing-row")

raw_data = {'Product_Name': [],
        'Product_SKU': [],
        'Product_ImageURL': [],
        'Product_URL': []
}

for ii in elem:
    raw_data['Product_Name'].append(
        ii.find_element_by_class_name('product-name').text
    )
    raw_data['Product_SKU'].append(
        ii.find_element_by_class_name('product-code').text
    )
    raw_data['Product_ImageURL'].append(
        ii.find_element_by_class_name('scaleAll').get_attribute('src')
    )
    raw_data['Product_URL'].append(
        ii.find_element_by_css_selector('a').get_attribute('href')
    )

df = pd.DataFrame(raw_data)
df.to_csv (r'/Users/reezalaq/PycharmProjects/wholesale/data.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...