提取HTML元素写入CSV时如何为每个承运商数据单独新增一行
Selenium爬取承运商数据CSV分行输出解决方案
问题根源
原有代码将所有承运商的字段全部追加到同一个一维列表中,最终写入CSV时仅写入一行,导致所有数据挤在同一行。
修正后完整代码
import csv from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options # 补全缺失的By类导入 from selenium.webdriver.common.by import By c_list = ['282131','365370','551712'] headers = ['Name','Unsafe Driving','d1','Crash Indicator','Hours Of Service','d2','Vehicle Maintenance','d3','CS/Alcohol','d4', 'HazMat','Driver Fitness','d5'] options = Options() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(executable_path = 'mypath/chromedriver.exe') # 总列表存储所有行数据,每个元素对应一个承运商的行 all_rows = [] for i in c_list: driver.get("https://ai.fmcsa.dot.gov/SMS") wait = WebDriverWait(driver, 20) wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@title='Close']"))).click() wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='MCSearch'])[2]"))).send_keys(i) wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='search'])[2]"))).click() wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='BASICs']/p[2]/a"))).click() carrier = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="basicInfo"]/div/h3'))) c = carrier.text tbl = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//tr[@class='valueRow sumData']"))) tab = tbl.text.replace("\n",','.strip()) tab = tab.split(",") # 单个承运商的行数据,第一个元素为承运商名称 current_row = [c] # 追加当前承运商的其余字段 current_row.extend(tab) # 将当前行加入总列表 all_rows.append(current_row) with open('table.csv','w', encoding='utf8', newline='') as myFile: writer = csv.writer(myFile) writer.writerow(headers) # 批量写入所有行,每个承运商单独占一行 writer.writerows(all_rows) # 释放资源关闭浏览器 driver.quit()
核心修改说明
- 补全
By类导入,修复元素定位时的依赖报错 - 将存储结构从一维列表调整为二维列表:总列表存储所有承运商的行数据,每个承运商对应独立的子列表
- 写入CSV时使用
writerows方法批量写入所有行,保证每个承运商单独占一行 - 新增
newline=''参数避免Windows系统下CSV出现多余空行 - 新增浏览器退出逻辑释放系统资源
内容的提问来源于stack exchange,提问作者alexb
相关产品推荐
相关产品推荐

