Python从webscraped数据格式化CSV

时间:2018-03-15 20:17:56

标签: python excel csv selenium

我设法完成了一个脚本来自动执行重复性任务。我在Python上的第一个!所以我现在正在自动化部件的过程中,我必须检索数据并格式化脚本以供使用。

以下是我的代码的相关部分:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import csv

ie = 'C:\\Users\\dd\\Desktop\\IEDriverServer32.exe'
print(ie)
Iebrowswer = webdriver.Ie(ie)
Iebrowswer.get('https://ww3.example.com/')

Iebrowswer.find_element_by_class_name('gridrowselect').click()

print(len(Iebrowswer.find_elements_by_class_name('gridrow'))) 

Gridcells = Iebrowswer.find_elements_by_class_name('gridcell')
Gridinfo = [i.text for i in Gridcells]
print(Gridinfo)

csvfile = 'C:\\Users\\dd\\Desktop\\CSV1.csv'
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    for val in Gridinfo:
        writer.writerow(['val'])  

我设法得到了我想要的信息。所有的。现在,我最大的问题是当我制作CSV时数据发生了什么。它出错了。这是我打印到shell时得到的结果(一个小例子):

['5555', '1', 'Verified', '', '6666', '2', 'Verified', '']

我的excel / csv文件正在垂直显示:

Columnl    
[5555]
[1]
[Verified]
[ ]
[6666]
[2] 
[Verified]
[ ]

我想要的是我的数据在空白空间后显示水平,如下所示:

Column1 Column2 Column3 Column4
5555    1       Verified 
6666    2       Verified
  1. 我如何实现这一目标?
  2. 我已经查看过这里的文档和其他一些问题,但我并没有更接近理解csv库及其参数。我似乎总是陷入这些非常简单的事情。我唯一成功的是添加更多列来垂直显示数据嘲弄自己。

2 个答案:

答案 0 :(得分:1)

我不确定为什么要将所有行作为单个列表返回。 writerow()模块的csv方法需要单个列表来表示一行。

for val in Gridinfo:
    writer.writerow(['val'])  

因此会为每个数据点赋予自己的行(请注意'val'是一个字符串文字,因此这段代码的输出只是字符串的行" val"而不是你的实际数据)。

要做的第一件事就是将单个列表分成多个长度为4的列表。我已经从here借用了分块函数;您可以根据具体情况在答案中看到其他方法。

这将为您提供嵌套列表。这对于writerows()方法来说是完美的(注意,复数)。

尝试:

def chunks(l, n):
    n = max(1, n)
    return [l[i:i+n] for i in range(0, len(l), n)]

with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(chunks(Gridinfo, 4))

编辑:

chunk()功能:

  1. 使用列表理解列表切片用于子列表
  2. n = max(1, n)是防御性编程。它基本上阻止你指定一个0或更短的块长度(这没有意义,并会抛出ValueError: range() arg 3 must not be zero异常)。对于所有意图和目的,你可以删除它,它将工作正常;为了避免这样的错误,保持它是没有害处的。
  3. 相当于:

    def chunks(my_list, chunk_size):
        new_list = [] # What we will return
        chunk = []    # Individual sublist chunk
        for item in my_list:
            if len(chunk) < 3:
                chunk.append(item)
            else:
                new_list.append(chunk) # Add the chunk to the output
                chunk = []             # Reset for the next chunk
                chunk.append(item)     # Make sure the current "item" gets added to the new chunk
    
        if len(chunk) >= 1:            # Catch any stragglers that don't make a complete chunk
            new_list.append(chunk)
    
        return new_list
    
    
    SUBLIST_LENGTH = 3
    list_to_be_chunked = [1, 2, 3, 4, 5, 6, 7]
    
    result = chunks(list_to_be_chunked, SUBLIST_LENGTH)
    print(result)
    

答案 1 :(得分:0)

import numpy as np
import csv

csvfile = r'C:\temp\test.csv'

Gridinfo = ['5555', '1', 'Verified', '', '6666', '2', 'Verified', '']

arr = np.resize(Gridinfo,(len(Gridinfo)/4,4))

with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(arr) 



#Output
5555    1   Verified
6666    2   Verified