python - 将网页抓取的表格放入excel(selenium,python)

标签 python excel selenium selenium-webdriver web-scraping

我想把我刮到的表格和它的标题放到excel中。我尝试了多种方法,但我似乎无法弄清楚如何在 excel 中正确显示它。下面还有一张图片可以显示我希望它如何理想地显示。先感谢您。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome("drivers/chromedriver")
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()
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@id='approvedCourseTable_1']//th[@class='header']")))])

table = ([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table#approvedCourseTable_1.tablesorter")))])

with open('out.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(table)



出于某种原因,在使用 table#approvedCourseTable_1.tablesorter 时将表格刮到 excel 仅显示“类(class)”,仅此而已。当我将标题和表格内容分开时,我可以将它们分别刮到 excel 中,但不能放在一起。另外,当我设法将表格内容刮到excel时,表格内容没有正确排列。
x = ([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table#approvedCourseTable_1 th.header")))])
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")))])
如果可能的话,我希望它像这样显示:enter image description here

最佳答案

我使用 Selenium/Python 进行这项工作。试试下面的代码示例,

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import csv
csvFile = open('out.csv', 'w')
writer = csv.writer(csvFile)


driver = webdriver.Chrome("drivers/chromedriver")
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()
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@id='approvedCourseTable_1']//th[@class='header']")))])

#table = ([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table#approvedCourseTable_1.tablesorter")))])

table_header = driver.find_element_by_xpath("(//table[@id='NcaaCrs_ApprovedCategory_All']//td[@class='hs_tableHeader'])[1]")
print(table_header.text)
writer.writerow(table_header.text)

#Find All Approved Categories
approved_Categories = driver.find_elements_by_xpath("//div[contains(@id,'NcaaCrs_ApprovedCategory_')]")

for i in range(len(approved_Categories)):
    cateogry_header = driver.find_element_by_xpath("//div[contains(@id,'NcaaCrs_ApprovedCategory_"+str(i+1)+"')]//td[@class='hs_tableHeader']")
    print(cateogry_header.text)
    writer.writerow(cateogry_header.text)
    #Find Course table header and rows
    course_headers = driver.find_elements_by_xpath("//table[contains(@id,'approvedCourseTable_"+str(i+1)+"')]/thead//th")
    header_val = []
    for headers in course_headers:
        header_val.append(headers.text)
    print(header_val)
    writer.writerow(header_val)
    course_rows = driver.find_elements_by_xpath("//table[@id='approvedCourseTable_"+str(i+1)+"']//tbody/tr")
    for j in range(len(course_rows)):
        row_values = driver.find_elements_by_xpath("//table[@id='approvedCourseTable_"+str(i+1)+"']//tbody/tr["+str(j+1)+"]/td")
        row_val = []
        for row in row_values:
            row_val.append(row.text)
        print(row_val)
        writer.writerow(row_val)


csvFile.close()
driver.quit()
CSV 输出将是这样的,
['Course\nWeight', 'Title', 'Notes', 'Max\nCredits', 'OK\nThrough', 'Disability\nCourse']
Approved Courses
English
['Course\nWeight', 'Title', 'Notes', 'Max\nCredits', 'OK\nThrough', 'Disability\nCourse']
['', 'AFRICAN LITERATURE', '', '', '', 'No']
['', 'AMERICAN LITERATURE', '', '', '', 'No']
['', 'AP ENGLISH LANGUAGE & COMPOSITION', '', '', '', 'No']
['', 'AP ENGLISH LITERATURE & COMPOSITION', '', '', '', 'No']
['', 'COLLEGE COMPOSITION', '', '', '', 'No']
['', 'ENGLISH 9 (ENG 091/092/093)', '', '', '', 'No']
['', 'ENGLISH 9/H', '', '', '', 'No']
['', 'PUBLIC SPEAKING', '', '', '', 'No']
['', 'WORLD STUDIES', '', '', '', 'No']
['', 'WORLD STUDIES HBC', '', '', '', 'No']
Social Science
['Course\nWeight', 'Title', 'Notes', 'Max\nCredits', 'OK\nThrough', 'Disability\nCourse']
['', 'AP WORLD HISTORY', '', '', '', 'No']
['', 'ECONOMICS', '', '', '', 'No']
['', 'GOVERNMENT', '', '', '', 'No']
['', 'PSYCHOLOGY', '', '', '', 'No']
['', 'US HISTORY', '', '', '', 'No']
['', 'US HISTORY/AP', '', '', '', 'No']
['', 'WORLD STUDIES', '', '', '', 'No']
['', 'WORLD STUDIES HBC', '', '', '', 'No']

关于python - 将网页抓取的表格放入excel(selenium,python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63231999/

相关文章:

excel - VBA在单元格中添加图像给出不同的结果

java - Selenium 断言等于行为

java - Maven 无法获取最新的 Selenium Java jar

python - 自动扩展 YAML 合并的工具?

python - RQ 超时不会终止多线程作业

Python删除数组中的所有负值

vba - 将 WKS 设置为可变工作表代码名称

php - 数据 Excel 到 MySql

python - ElementClickInterceptedException : element click intercepted:

python - 保留 python 字典顺序 - (python dict 的延续)