Мне не удается получить пригодный для использования фрейм данных после очистки веб-сайта. Я знаю, что мне нужно превратить мой список в список списков, и это легко сделать с фреймом данных 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
в полный кадр, т.е. он возвращает только последнюю строку этого кадра:
Когда я хочу КАЖДЫЙ строку в таблице с веб-страницы Strava. Как мне динамически переносить каждую строку в таблицу (с ежедневным изменением количества строк) и не устанавливать .reshape()
вручную каждый раз, когда я запускаю скрипт?
Для справки вот скриншот таблицы. Есть 7 столбцов, и количество строк должно отражать количество строк в таблице, даже количество строк меняется ежедневно: