python - 提取 HTML 元素时在 CSV 中添加新行
问题描述
经过几天的研究和数百个错误,我几乎达到了我的代码目标,但仍然缺少一些细节。在这里,我正在抓取一个网站以获取一些信息并将其提取到 Excel 中。我在这里试图克服的问题是为每个运营商创建一条新生产线。现在,输出是一个列表,我无法弄清楚如何将每个运营商信息字符串分开。
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
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')
a=[]
c=[]
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(",")
a.append(c)
for x in tab:
a.append(x)
with open('table.csv','w', encoding='utf8') as myFile:
writer = csv.writer(myFile)
writer.writerow(headers)
writer.writerow(a)
解决方案
这个问题在Can you encode CR/LF in into CSV files?中得到了很好的回答。
还可以考虑在 Excel 中对多行进行逆向工程。要在 Excel 单元格中嵌入换行符,请按Alt+Enter
。然后将文件另存为 .csv。您会看到双引号从一行开始,文件中的每一行都被认为是单元格中嵌入的换行符。
要将其保存为.csv
文件,您需要双引号值,因此如果存在,它不会破坏您的列并csv
转义"
""
for article in articles:
...
# description = re.sub(r"[\r\n]+", " ", description)
description = description.replace('"', '""')
rows = '"%s","%s","%s","%s"\n' % (title, date, description, info)
f.write(rows)
推荐阅读
- javascript - 输入出生日期时如何限制允许的年龄
- html - VScode 使用 WSL 运行 HTML 文件时打开空白浏览器窗口
- payment-gateway - Bluesnap 托管支付页面自定义元数据
- node.js - 在 nodejs 中的 aws lambda 中从 s3 读取文件后将数据传递到 aws cognito 时函数退出
- php - PHP7.2 无法加载rdkafka
- javascript - 使用前一个 promise 的 id 值进行另一个 promise 调用
- cassandra - Cassandra SSTable 损坏 - 如何预防?
- delphi - 如何在运行时使用 TCustomTeeFunction 和 TButton 生成正弦图?
- python - 将 Oauth2 与请求正文一起使用
- flutter - 当我尝试访问时,我的相机胶卷被随机播放