我写了一个脚本,我从某个网站获取产品并以csv格式保存数据。现在的问题是,有些产品的规格较少或者有些产品,而有些产品在某些产品根本没有产品的情况下会更多。我解决了获取规格的问题,但输出数据存储在A1,A2,A3等格式的csv中,我想要它在A1,B1,C1等等。
这是一个csv数据示例:
A B
1. ['Weight '] ['0.3430']
2. ['Tag line'] ['Take Control']
3. ['Model'] ['Rhythm RX40']
4. ['Type'] ['Smart Phone']
5. ['Processor'] ['Dual Core']
而我需要的是:
A B C D E
1. ['Weight '] ['Tag line'] ['Model'] ['Type'] ['Processor']
2. ['0.3430'] ['Take Control'] ['Rhythm RX40'] ['Smart Phone'] ['Dual Core']
这是我的python代码:
with open('exampleCOM-'+ '(rivo)' +'-products.csv', 'a+', newline='') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',')
for title in mainTree.xpath('(//*[@id="product_addtocart_form"]/div[@class="product-name"]/text())[2]'):
title = title.strip()
print (title)
row_info = [title]
csvwriter.writerow(row_info)
while (mainTree.xpath("//tr[" + str(i) + "]")):
specName = [specName for specName in mainTree.xpath("//tr[" + str(i) + "]/td[1]/text()")]
spec = [spec for spec in mainTree.xpath("//tr[" + str(i) + "]/td[2]/text()")]
row_info = [specName, spec]
csvwriter.writerow(row_info)
i += 1
我尝试了什么:
row_info = [specName[1], specName[2], specName[3], specName[4], specName[5]]
row_info2 = [spec[1], spec[2], spec[3], spec[4], spec[5]]
csvwriter.writerow(row_info)
csvwriter.writerow(row_info2)
但我得到"IndexError: list index out of range"
错误,据我所知,specName和spec list应该是索引大小为5.
答案 0 :(得分:0)
阐述@DanielRoseman评论:python中列表的索引从零开始。这意味着以下列表
>>> l = [42, 23, 17]
包含三个项目
>>> len(l)
3
第一项(索引0)为42,第三项(索引2)为17:
>>> l[0]
42
>>> l[2]
17
虽然索引3没有项目,但它会指向列表中的第四项。
>>> l[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
因此,如果您将代码与包含五个元素的列表一起使用,则代码会崩溃。
修改强>
在您的情况下,错误可能来自另一个点。据我所知,代码(这意味着你正在使用的XML文件的结构一无所知),似乎总是得到specName和spec的长度列表。如果您尝试将其编入索引,如代码中所示,则会在那里遇到索引错误。
在您的代码中,您将获取每个specName / spec对并直接将其写入输出文件。这也意味着,您一次只能访问一个specName / spec对,因为您在while循环的每次迭代中都会覆盖它们。
要获得所需的输出格式,可能更容易保留两个列表(一个用于规范名称,一个用于规范本身),并在循环后批量写入结果。
# initilize empty lists to collect specNames and specs
specs = []
specNames = []
while (mainTree.xpath("//tr[" + str(i) + "]")):
specNames.append([specName for specName in mainTree.xpath("//tr[" + str(i) + "]/td[1]/text()")])
specs.append([spec for spec in mainTree.xpath("//tr[" + str(i) + "]/td[2]/text()")])
i += 1
# write all specNames as first row
csvwriter.writerow(specNames)
# write all specs as second row
csvwriter.writerow(specs)
这样可以省去转换的麻烦,也适用于任意数量的specNames / specs。
我希望这会有所帮助。