首页 > 解决方案 > Writer 将奇怪的格式输出到 CSV

问题描述

几天来我一直在尝试解决这个问题,但似乎无法弄清楚如何正确完成它。最初在将条目打印到 csv 时遇到问题,但多亏了 SO,很快就解决了。

问题是,当我将 xpath 条目打印到 csv 时,格式变得非常奇怪,因此在将其导入 Excel 或 Web 时会出现很多格式问题。打开或预览时,CSV 中的打印格式如下所示:

['something'] ['something\nblabla'] ['som&asddng\n2blas']

我故意使用writerow(entries),因为我希望列表在一行中,每个条目作为一列。我曾尝试使用:

  1. writerows(zip(entries)但 CSV 的格式是相同的。
  2. writerows(entries)这给了我每个条目的正确格式,但显然将每个条目写为一个新行。
  3. usingre但这只会在 csv 文件中附加许多行时破坏格式(即,当代码用于多页的 for 循环时)。

因此我有两个问题:

1. 为什么会出现这种格式? 2. 格式化问题怎么解决!?

我使用了以下代码:

import csv
def get_elements_by_xpath(driver, xpath):
        return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

File = open('list.csv', 'w')
writer = csv.writer(File)
facts = [("//div[@class='left-col']/h6[2]"),
    ("//div[@class='left-col']"),
    ("//div[@class='left-col']/h6[1]"),
    ("//div[@class='left-col']/strong[1]"),
    ("//div[@class='left-col']/strong[2]"),
    ("//div[@class='left-col']//a[@rel='nofollow']")]
entries = []
for xpath in facts:
    entries.append(get_elements_by_xpath(driver, xpath))
print(entries)
writer.writerow(entries)
File.close()

标签: pythoncsv

解决方案


正如用户@furas 建议的那样,我尝试应用entries.extend()而不是,entries.append()结果证明这可以将xpath 条目列表排列成一行,每个xpath 条目都是一列以及干净的csv 输出。

请参阅适用于以下代码的解决方案:

import csv
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.example.com/list/')

File = open('list.csv', 'w')
writer = csv.writer(File)

def get_elements_by_xpath(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

facts = [("//div[@class='left-col']/h6[2]"),
    ("//div[@class='left-col']"),
    ("//div[@class='left-col']/h6[1]"),
    ("//div[@class='left-col']/strong[1]"),
    ("//div[@class='left-col']/strong[2]"),
    ("//div[@class='left-col']//a[@rel='nofollow']")]

entries = []
for xpath in facts:
    entries.extend(get_elements_by_xpath(driver, xpath)) # .extend instead of .append
writer.writerow(entries)
File.close()

推荐阅读