Как я могу экспортировать очищенную информацию в CSV? - PullRequest
1 голос
/ 30 июня 2019

У меня есть код, который с помощью сообщества stackoverflow (привет @ chitown88) мне удалось запустить просто весело.Целью кода является очистка имени, цены и ссылки с веб-сайта.Когда я использую функцию печати, это дает мне список отлично.Код выглядит следующим образом:

    import requests
    import csv
    from bs4 import BeautifulSoup
    for x in range(0, 70):
        try:
            urls = 'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]='  +str(x+1) +'&ajax=ok?_=1561559181560'
        source = requests.get(urls).text
        soup = BeautifulSoup(source, 'lxml')
        print('Page: %s' %(x+1))
        for figcaption in soup.find_all('figcaption'):
            price = figcaption.find('span', {'class':'new_price'}).text.strip()
            name = figcaption.find('a', class_='title').text
            link = figcaption.find('a', class_='title')['href']
            print('%s\n%s\n%s' %(price, name, link))
        except:
            break

Теперь для последней части мне нужно экспортировать эту информацию в файл CSV.Я пытался сделать это, но пока не повезло.Любые предложения?

Я пытался реализовать функцию экспорта CSV следующим образом:

    import csv
    import requests
    from bs4 import BeautifulSoup
    csv_file = open('cms_scrape.csv', 'w')
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['name', 'link', 'price'])
    for x in range(0, 70):
        try:
            urls = 'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]=' + str(x + 1) + '&ajax=ok?_=1561559181560'
            source = requests.get(urls).text
            soup = BeautifulSoup(source, 'lxml')
            print('Page: %s' % (x + 1))
            for figcaption in soup.find_all('figcaption'):
               price = figcaption.find('span', {'class': 'new_price'}).text.strip()
               name = figcaption.find('a', class_='title').text
               link = figcaption.find('a', class_='title')['href']
               print('%s\n%s\n%s' % (price, name, link))
               csv_writer.writerow([name, link, price])
        except:
            break
    csv_file.close()

этот код просто дает мне CSV-файл с именем, ссылкой, заголовками цены, что все три находятся в столбце 1а не столбец с 1 по 3.

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Вы можете использовать стандартный объект csv.writer() для записи списка в виде строки в файл CSV.Файл должен быть закодирован в формате utf-8 и иметь параметр newline='' (см. Документацию).

import requests
import csv
from bs4 import BeautifulSoup

with open('output.csv', 'w', newline='', encoding='utf-8') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['name', 'link', 'price'])

    for x in range(1, 101):
        urls = f'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]={x}&ajax=ok?_=1561559181560'

        source = requests.get(urls).text
        soup = BeautifulSoup(source, 'lxml')

        print(f'Page: {x}')
        figcaptions = soup.find_all('figcaption')

        if figcaptions:
            for figcaption in figcaptions:
                price = figcaption.find('span', {'class':'new_price'}).text.strip()
                name = figcaption.find('a', class_='title').text
                link = figcaption.find('a', class_='title')['href']

                csv_output.writerow([name, link, price])
        else:
            print("Finished")
            break

Кроме того, я бы порекомендовал использовать более новое форматирование строки с префиксом f передвашей строки.Затем вы можете включить переменные непосредственно в текст, используя {}.

. Вы можете выйти из цикла, когда обнаружите, что нет записей figcaption.

Это даст вамначало файла CSV:

name,link,price
کاتریس پودر برنزه سان گلو 030,https://www.meisamatr.com/fa/product/آرایشی/آرایش-صورت/پودر-صورت/6288-کاتریس-پودر-برنزه-سان-گلو-030.html,"68,500 تومان"
اوتلت بورژوا مداد لب ادیشن 12,https://www.meisamatr.com/fa/product/آرایشی/آرایش-لب/مداد-لب/6286-اوتلت-بورژوا-مداد-لب-ادیشن-12.html,"57,000"
0 голосов
/ 30 июня 2019

Я бы предложил использовать следующую структуру:

csv.DictWriter

import csv
import requests
from bs4 import BeautifulSoup

with open('cms_scrape.csv', 'w') as csv_file:
    fieldnames = ['name', 'link', 'price']
    csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter='\t')
    csv_writer.writeheader()
    for x in range(0, 70):
        try:
            urls = 'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]=' + str(
                x + 1) + '&ajax=ok?_=1561559181560'
            source = requests.get(urls).text
            soup = BeautifulSoup(source, 'lxml')
            print('Page: %s' % (x + 1))
            for figcaption in soup.find_all('figcaption'):
                price = figcaption.find('span', {'class': 'new_price'}).text.strip()
                name = figcaption.find('a', class_='title').text
                link = figcaption.find('a', class_='title')['href']
                print('%s\n%s\n%s' % (price, name, link))

                dict_row = dict(zip(fieldnames, [price, name, link]))

                csv_writer.writerow(dict_row)
        except:
            continue
...