Dynami c numpy изменение формы таблицы в python - PullRequest
0 голосов
/ 05 мая 2020

Мне не удается получить пригодный для использования фрейм данных после очистки веб-сайта. Я знаю, что мне нужно превратить мой список в список списков, и это легко сделать с фреймом данных stati c. Но вот загвоздка: мои очищенные данные меняются ежедневно , и я хочу автоматизировать создание фрейма данных. Сначала я очищаю данные:

### Libraries/packages
import pandas as pd
import numpy as np
import re
import requests
import datetime
from datetime import datetime
import urllib
from selenium import webdriver
from selenium.webdriver.chrome.options import Options 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup


### Function 1
def strava_page():

    urllist = ['https://www.strava.com/login',
               'https://www.strava.com/clubs/roosevelt-island-dc-parkrun']

    return urllist

### Function 2
def strava_login(urllist):

    # navigate to page
    driver = webdriver.Chrome(executable_path = r"/Users/user/Documents/chromedriver")
    driver.get(urllist[1])

    # last week's leaderboard
    last_week = driver.find_element_by_css_selector('body > div.view > div.page.container > div:nth-child(4) > div.spans11 > div > div:nth-child(2) > ul > li:nth-child(1) > span')
    last_week.click()

    # getting rows from leaderboard
    table_rows = []
    myrow = []
    totalrows = len(driver.find_elements_by_xpath("//div[@class='leaderboard']/table/tbody//tr"))
    print("[Number of Rows in Leaderboard]:", totalrows)

    # gets individual rows, and puts each one into its own list
    for i in range(totalrows):
        myrow.clear()
        for items in driver.find_elements_by_xpath("//div[@class='leaderboard']/table/tbody//tr["+str(i+1)+"]/td"):
            myrow.append(items.text)
        table_rows.append(myrow)
        print(myrow)

    driver.close()

    # myrow variable is a list
    print(type(myrow))

    # column names
    my_columns = ['Rank', 'Athlete', 'Distance', 'Runs', 'Longest', 'Avg. Pace', 'Elev. Gain']


    # PROBLEM AREA *************
    new_table = pd.DataFrame(np.array(myrow).reshape(1, 7), columns = my_columns)

    return new_table

### Calling functions
one = strava_page()
two = strava_login(one)
two

Я продолжаю получать cannot reshape data size ошибки. Я знаю, что изменение формы numpy - это правильный путь к go. Но я не могу получить вывод myrow в полный кадр, т.е. он возвращает только последнюю строку этого кадра:

enter image description here

Когда я хочу КАЖДЫЙ строку в таблице с веб-страницы Strava. Как мне динамически переносить каждую строку в таблицу (с ежедневным изменением количества строк) и не устанавливать .reshape() вручную каждый раз, когда я запускаю скрипт?

Для справки вот скриншот таблицы. Есть 7 столбцов, и количество строк должно отражать количество строк в таблице, даже количество строк меняется ежедневно:

enter image description here

1 Ответ

0 голосов
/ 06 мая 2020

Относительно простое исправление, все, что мне потребовалось, - это немного проигнорировать работу и поиграть с numpy за пределами l oop:

new_table = np.array(myrow).reshape(-1, 7)
previous_week = pd.DataFrame(new_table, columns = my_columns)

Я избавился от myrow.clear() и вернул previous_week. Работал как шарм после того, как я обнаружил метод -1 в np.reshape().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...