我有一个代码,借助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列。
答案 0 :(得分:0)
我建议使用以下结构:
csv.DictWriter
undefined
答案 1 :(得分:0)
您可以使用标准的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"