python - Writer 将奇怪的格式输出到 CSV
问题描述
几天来我一直在尝试解决这个问题,但似乎无法弄清楚如何正确完成它。最初在将条目打印到 csv 时遇到问题,但多亏了 SO,很快就解决了。
问题是,当我将 xpath 条目打印到 csv 时,格式变得非常奇怪,因此在将其导入 Excel 或 Web 时会出现很多格式问题。打开或预览时,CSV 中的打印格式如下所示:
['something'] ['something\nblabla'] ['som&asddng\n2blas']
我故意使用writerow(entries)
,因为我希望列表在一行中,每个条目作为一列。我曾尝试使用:
writerows(zip(entries)
但 CSV 的格式是相同的。writerows(entries)
这给了我每个条目的正确格式,但显然将每个条目写为一个新行。- using
re
但这只会在 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()
解决方案
正如用户@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()
推荐阅读
- r - R 在滑动窗口时间段内创建先前事件的计数
- python - 是否可以创建嵌套类属性?
- node.js - 如何从 AJAX 发布请求访问服务器端的数据
- python - Python.h:没有这样的文件或目录,当使用 CLion 将 python 实现到 c++ 中时
- .net - 在 Visual Studio 2019 中作为“单个文件”发布时如何摆脱 SNI.dll?
- excel - 根据列中的值选择行
- python - 在行 [NumPy 或 Tensorflow] 的索引值之前将行中的值设置为零
- angular - 根据 Observable 本身的数据填充 Observable 中的数据
- mysql - MYSQL 填充了一些行,但不支持
- swift - SwiftUI 表单中的奇怪选择器视图隐藏动画