You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:27:02