我刮了标题和价格以及链接和信息表,当我编写CSV文件时,我得到了重复的标题和价格以及链接

时间:2019-07-16 21:41:28

标签: python web-scraping

我想用空列值替换重复的标题和价格以及链接。

import requests
import csv
from bs4 import BeautifulSoup 
requests.packages.urllib3.disable_warnings()
import pandas as pd
url = 'http://shop.kvgems-preciousstones.com/'

while True:
    session = requests.Session()
    session.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}

    content = session.get(url, verify=False).content
    soup = BeautifulSoup(content, "html.parser")
    posts = soup.find_all('li',{'class':'item'})

    data = []
    for url in posts:

        title = url.find('h2',{'product-name'}).text
        price = url.find('span',{'price'}).text
        link = url.find('a').get('href')
        url_response = requests.get(link)
        url_data = url_response.text
        url_soup = BeautifulSoup(url_data, 'html.parser')

        desciption = url_soup.find('tr')
        for tr in url_soup.find_all('tr'):
            planet_data = dict()
            values = [td.text for td in tr.find_all('td')]
            planet_data['name'] = tr.find('td').text.strip()
            planet_data['info'] = tr.find_all('td')[1].text.strip()
            data.append((title,price,planet_data,link))   

    #data_new = data +","+ data_desciption
    #urls = soup.find('a',{'class': 'next i-next'}).get('href')
    #url = urls
    #print(url)

    with open('ineryrge5szdqzrt.csv', 'a') as csv_file:
     writer = csv.writer(csv_file)
     writer.writerow(['title','price','name','info','link'])
     #The for loop
     for title,price,planet_data,link in data:

     writer.writerow([title,price,planet_data['name'],planet_data['info'],link])    

当我写CSV时,我得到了重复的标题,价格,链接的结果,但是我只想得到1个标题,价格,信息和链接,而其余的都为空。

1 个答案:

答案 0 :(得分:0)

第一个for循环提取公共值(标题,价格和链接)。然后第二个for循环提取每个项目的所有数据属性。

但是,您随后将标题,价格和链接字段写入每行数据的CSV文件中。您只需要对数据的第一行执行此操作。

要检测第二个for循环是否在第一行,可以将其更改为使用enumerate函数,该函数为您提供了额外的index变量。然后,您可以使用该值只写标题,价格,链接(如果为0:

        for index, tr in enumerate(url_soup.find_all('tr')):
            planet_data = dict()
            values = [td.text for td in tr.find_all('td')]
            planet_data['name'] = tr.find('td').text.strip()
            planet_data['info'] = tr.find_all('td')[1].text.strip()
            if index == 0:
                data.append((title,price,planet_data,link))
            else:
                data.append((None,None,planet_data,None))

(而且我认为您不需要最初的while True:部分。)