При очистке данных с веб-сайта и записи в файл CSV в файл была записана только последняя строка. - PullRequest
0 голосов
/ 15 мая 2018

Я использую Python и красивый суп для извлечения данных с веб-страницы, и это работает. Проблема в том, что он не вставляет все значения в CSV-файл. Например, если я извлекаю 10 значений данных, тогда только 10-е значение данных попадает в CSV-файл, а 9-е - нет. Все 10 значений данных отображаются в терминале, но не в файле CSV.

импорт библиотек

import csv

import urllib.request
from bs4 import BeautifulSoup



# specify the url
quote_page = "https://www.cardekho.com/Hyundai/Gurgaon/cardealers"
#quote_page = input("Enter Data Source Here : ")
page = urllib.request.urlopen(quote_page)



# parse the html using beautiful soup and store in variable `soup`
soup = BeautifulSoup(page, "lxml")


# Take out the <div> of name and get its value
delrname = soup.find_all('div', class_='deleadres')
for name in delrname:
    dname = name.find('div', class_="delrname").text # name
    print(dname)
for address in delrname:
    dadres = address.find('p').text
    print(dadres)
for mobile in delrname:
    dmobile = mobile.find('div', class_="clearfix").text
    print(dmobile)
for email in delrname:
    demail = email.find('div', class_="mobno").text
    print(demail)





#exorting data into csv file....
with open('result.csv',newline='') as f:
    r = csv.reader(f)
    data = [line for line in r]
with open('result.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerow(['NAME','ADDRES','MOBILE','EMAIL'])
    w.writerow([dname,dadres,dmobile,demail])**strong text**

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ваша ошибка в том, что вы сохраняете только последнее значение из цикла, следовательно, вы не получаете все значения.

Другой способ сделать это:

1) Добавить значения из цикла в список

2) Добавить значения из списка в CSV

page = urllib.request.urlopen(quote_page)
# CREATE NEW LISTS
dname_list = list()
dadres_list = list()
dmobile_list = list()
demail_list = list()


# parse the html using beautiful soup and store in variable `soup`
soup = BeautifulSoup(page, "lxml")

# APPEND TO THE LIST
# Take out the <div> of name and get its value
delrname = soup.find_all('div', class_='deleadres')
for name in delrname:
    dname = name.find('div', class_="delrname").text # name
    print(dname)
    dname_list.append(dname)
for address in delrname:
    dadres = address.find('p').text
    print(dadres)
    dadres_list.append(dadres)
for mobile in delrname:
    dmobile = mobile.find('div', class_="clearfix").text
    print(dmobile)
    dmobile_list.append(dmobile)
for email in delrname:
    demail = email.find('div', class_="mobno").text
    print(demail)
    demail_list.append(demail)


#exorting data into csv file....
with open('result.csv',newline='') as f:
    r = csv.reader(f)
    data = [line for line in r]
with open('result.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerow(['NAME','ADDRES','MOBILE','EMAIL'])
    # TRAVERSE THROUGH THE LIST
    for i in range(len(dname)):
        try:
            w.writerow([dname_list[i],dadres_list[i],dmobile_list[i],demail_list[i]])
        except IndexError:
            print('')

PS: ответ Хакена - лучший способ сделать это.Я просто хотел дать вам знать, как это сделать.

0 голосов
/ 15 мая 2018

Когда вы присваиваете значения в цикле for, вы заменяете предыдущее значение. Поэтому вне цикла вы останетесь с окончательным значением.

for number in 1, 2, 3:
    print(number) # prints 1, then 2, then 3
print(number) # prints only 3, since that was the final value.

В вашем скрипте используйте один цикл for для извлечения значений и записи строк данных в CSV.

with open('result.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerow(['NAME','ADDRES','MOBILE','EMAIL']) # write header once
    entries = soup.find_all('div', class_='deleadres')
    for entry in entries: # loop over all `.deleadres` elements
        dname = entry.find('div', class_="delrname").text
        dadres = entry.find('p').text
        dmobile = entry.find('div', class_="clearfix").text
        demail = entry.find('div', class_="mobno").text
        w.writerow([dname,dadres,dmobile,demail]) # write data rows for each entry
...