У меня есть две функции, которые очищают две разные таблицы на этом сайте (вам нужно создать быструю учетную запись и войти в систему, чтобы увидеть ее). Первая таблица отлично работает и легко адаптируется к разным страницам в одном формате, поскольку заголовки столбцов не меняются (функция scrape_column
). Однако для второй таблицы (функция scrape_by_county_table
заголовки почти всегда меняются от страницы к странице, поэтому мне нужен способ динамически связывать данные, очищенные с каждым заголовком, и правильно связывать их в словаре pandas dataframe Я пробовал пару разных вещей, которые не сработали, помощь очень ценится !!
Мой код:
# Dictionary that associates easier to understand words to the actual column numbers in the table
columns = { "Candidates": "2", "Votes": "3", "Pcts": "4", "5": "5", "Check": "5" }
# Function to convert column name to column number, find the column, and get it's text
def scrape_column (column):
column_number = columns[column]
col_values = []
raw = WebDriverWait(driver, delay).until(EC.presence_of_all_elements_located((By.XPATH, f"//div[@class='top-line-table']//tbody//td[{column_number}]")))
for ii in raw:
col_values.append(ii.text)
return col_values
# Function to scrape each column of the county table
def scrape_by_county_table(column):
headers = driver.find_elements_by_xpath(f'//*[@id="content"]/div/div[3]/div/div[2]/div/div[2]/div/div[2]/div[1]/div/table/thead/tr/th')
county_table_header_values = []
for each in headers:
county_table_header_values.append(each.text)
# print(county_table_header_values)
county_table_col_values = []
raw_counties = driver.find_elements_by_xpath(f'//*[@id="content"]/div/div[3]/div/div[2]/div/div[2]/div/div[2]/div[1]/div/table/tbody/tr/td[{column}]')
for i in raw_counties:
county_table_col_values.append(i.text)
return county_table_col_values
candidates = scrape_column("Candidates")
votes = scrape_column("Votes")
percentages = scrape_column("Pcts")
#
final_results = pd.DataFrame ({
"Candidate": candidates,
"Votes": votes,
"Percentage": percentages,
})