Python CSV导出4个相同的行

时间:2017-09-21 14:39:42

标签: python-3.x

我使用了这里描述的方法之一Python write to CSV line by line来尝试将输出的所有行写入.CSV。我设法让它进入输出和生成CSV的阶段,但不是显示我的数据的所有行,而是看到一行,重复4次,没有别的。

有谁可以看到这里的问题是什么?

from bs4 import BeautifulSoup
import requests
import csv

headers = {'User-Agent': 'Mozilla/5.0'}

for i in range(1, 300):
    url = "xxx?page=%s" % i

    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    items = soup.find_all('div', class_='product-block__info')
    for item in items:
        product = item.find('span', class_='short_desc').text
        stock = item.find('span', class_='count_product_stock hidden').text
        brand = item.find('h4', class_='brand').text
        price = item.find('span', class_='selling_price').text

        # create a list of all the fields    
        sheets = [brand, product, stock, price]

        print(sheets)

        with open('csvfile.csv','wt') as file:
            for l in sheets:
                file.writelines(sheets)
                file.write('\n')

1 个答案:

答案 0 :(得分:1)

您可能想要更像以下未经测试的代码。提供的示例无法按原样运行:

from bs4 import BeautifulSoup
import requests
import csv

headers = {'User-Agent': 'Mozilla/5.0'}

# Open the file once.  See the csv documentation for the correct way to open
# a file for use with csv.writer.  If you plan to open the .csv with
# Excel, the utf-8-sig encoding will allow non-ASCII to work correctly.
with open('csvfile.csv','w', encoding='utf-8-sig', newline='') as f:
    file = csv.writer(f)  # actually use the CSV module.

    for i in range(1, 300):
        url = "xxx?page=%s" % i

        response = requests.get(url, headers=headers)
        soup = BeautifulSoup(response.text, "html.parser")
        items = soup.find_all('div', class_='product-block__info')
        for item in items:
            product = item.find('span', class_='short_desc').text
            stock = item.find('span', class_='count_product_stock hidden').text
            brand = item.find('h4', class_='brand').text
            price = item.find('span', class_='selling_price').text

            # create a list of all the fields    
            sheets = [brand, product, stock, price]

            # write a single line.
            file.writerow(sheets)

这是一个将在Excel中打开的测试示例。我在数据中加入了非ASCII字符和逗号来演示csv模块处理它的能力:

#coding:utf8
import csv

with open('csvfile.csv','w', encoding='utf-8-sig', newline='') as f:
    file = csv.writer(f)
    file.writerow('BRAND PRODUCT STOCK PRICE'.split())
    for i in range(1,11):
        sheets = ['brand{}'.format(i),'pröduct{}'.format(i),'st,ock{}'.format(i),'price{}'.format(i)]
        file.writerow(sheets)

输出:

BRAND,PRODUCT,STOCK,PRICE
brand1,pröduct1,"st,ock1",price1
brand2,pröduct2,"st,ock2",price2
brand3,pröduct3,"st,ock3",price3
brand4,pröduct4,"st,ock4",price4
brand5,pröduct5,"st,ock5",price5
brand6,pröduct6,"st,ock6",price6
brand7,pröduct7,"st,ock7",price7
brand8,pröduct8,"st,ock8",price8
brand9,pröduct9,"st,ock9",price9
brand10,pröduct10,"st,ock10",price10

在Excel中:

Excel image