Веб-парсинг для Excel, несоответствие текста (селен, python) - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь превратиться в веб-сайт, чтобы преуспеть, но я не могу получить список курсов, которые можно было бы согласовать должным образом. это всего лишь одна длинная строка в одном ряду. Я бы хотел, чтобы каждая строка для каждого курса находилась в соответствующей категории (см. изображение для справки).

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import re
import csv

driver = webdriver.Chrome("drivers/chromedriver")

# driver.get("https://web3.ncaa.org/hsportal/exec/hsAction")

driver.get("https://web3.ncaa.org/hsportal/exec/hsAction")
Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "state")))).select_by_visible_text("New Hampshire")
driver.find_element_by_xpath("//input[@id='city']").send_keys("Moultonborough")
driver.find_element_by_xpath("//input[@id='name']").send_keys("Moultonborough Academy")
driver.find_element_by_xpath("//input[@value='Search']").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='hsCode']"))).click()

x = driver.find_elements_by_xpath("(//tr[th[@class='header']])[1]/th")
head = [re.sub('\s+',' ',el.text) for el in x]
y =  = ([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table#approvedCourseTable_1 td")))])

with open('out.csv', 'w', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(head)
    writer.writerow(courses)

в настоящее время это выглядит так: enter image description here

but would like it like this: введите описание изображения здесь

1 Ответ

0 голосов
/ 04 августа 2020

Я взял на себя смелость использовать другую библиотеку. Если вам действительно нужен вывод csv, тогда будет достаточно легко настроить бит pandas в соответствии с вашими потребностями. Вы можете использовать to_csv ().

main_table = driver.find_element_by_id("NcaaCrs_ApprovedCategory_All")  # Parent table.
titles = iter([title.text for title in main_table.find_elements_by_class_name("hs_tableHeader")][1:])  # Get titles above the tables, ignoring the general title in the first entry.

tables = main_table.find_elements_by_tag_name("table[id*=approvedCourseTable")  # Find all tables by partial id.
tables_html = "\n".join([table.get_attribute('outerHTML') for table in tables])  # Combine html of all tables.
tables_df = pd.read_html(tables_html)  # Creates a list of table DataFrames.

writer = pd.ExcelWriter("temp.xlsx", engine='openpyxl')

for table_df in tables_df:  # Loop through DataFrames
    title = next(titles).replace("/", "-")  # Select next title and clean it up for excel sheet name.
    table_df.to_excel(writer, sheet_name=title, index=False)  # Send DataFrame to writer on individual sheet.
writer.save()  # Save Excel file.

Надеюсь, он достигнет того, что предполагалось.

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