Сохраните словарь в Excel с помощью Python

#python #pandas

Вопрос:

Мне нужна ваша помощь, чтобы сохранить данные в Excel. Я проанализировал какой-то сайт, и мне нужно ввести словарь в Excel.

 from scrapingbee import ScrapingBeeClient
import requests
from bs4 import BeautifulSoup
import pandas as pd

SCRAPINGBEE_API_KEY = "bzzzz"
endpoint = "https://app.scrapingbee.com/api/v1"
pages = [
    'https://www.businesslist.com.ng/category/restaurants/1/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/2/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/3/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/4/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/5/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/6/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/7/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/8/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/9/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/10/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/11/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/12/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/13/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/14/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/15/city:lagos'
    ]

rest = []

#GET_LINKS
for url in pages[:1]:
    params = {
    'api_key': SCRAPINGBEE_API_KEY,
    'url': url}

    response = requests.get(endpoint, params=params)
    soup = BeautifulSoup(response.content, 'html.parser')

    body = soup.find_all('h4')
    for items in body:
        item = items.find('a').get('href')
        item_link = 'https://www.businesslist.com.ng'   item
        rest.append(item_link)

#GET_REST

for url in rest[:2]:
    params = {
    'api_key': SCRAPINGBEE_API_KEY,
    'url': url}
    info = {}
    response = requests.get(endpoint, params=params)
    soup = BeautifulSoup(response.content, 'html.parser')

    restaraunt_name = soup.find('b', {'id':'company_name'}).text
    info.update({'Restaraunt':restaraunt_name})
    location = soup.find('div', {'class':'text location'}).text.split('View Map')[0]
    info.update({'Location':location})
    phone = soup.find('div', {'class':'text phone'}).text[:11]
    info.update({'Phone':phone})    
    web = soup.find('div', {'class':'text weblinks'}).text
    info.update({'web':web})
    df = pd.DataFrame(info)
    df.to_excel('./Lagos.xlsx') 
 

Я получаю ссылку для анализа из списка «rest», затем получаю данные по этой ссылке. Затем я хочу сохранить каждый элемент из всех ссылок на словарь «информация». Затем сохраните его в файле Excel. Но код сохраняет в файл одну строку, а не все. Я кое-что упустил.

Ответ №1:

Вы сохраняете df внутри цикла с тем же именем, он создаст только один дикт(означает каждое значение цикла в excel). поэтому вам лучше создать пустой фрейм данных вне цикла и сохранить его в файле Excel после завершения выполнения цикла.

Ваш измененный код будет выглядеть так

 all_info = pd.DataFrame()

for url in rest[:2]:
    params = {
    'api_key': SCRAPINGBEE_API_KEY,
    'url': url}
    info = {}
    response = requests.get(endpoint, params=params)
    soup = BeautifulSoup(response.content, 'html.parser')

    restaraunt_name = soup.find('b', {'id':'company_name'}).text
    info.update({'Restaraunt':restaraunt_name})
    location = soup.find('div', {'class':'text location'}).text.split('View Map')[0]
    info.update({'Location':location})
    phone = soup.find('div', {'class':'text phone'}).text[:11]
    info.update({'Phone':phone})
    web = soup.find('div', {'class':'text weblinks'}).text
    info.update({'web':web})
    if len(all_info) == 0:
        all_info = pd.DataFrame(info, index=range(len(info)))
    else:
        all_info = all_info.append(pd.DataFrame(info))
all_info.to_excel('./Lagos.xlsx')
 

Комментарии:

1. —> 65 all_info.to_excel(‘./Lagos.xlsx’) Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘to_excel’

Ответ №2:

Как насчет создания списка со всеми данными, затем преобразования его в фрейм данных и последующего вывода в файл Excel?

 from scrapingbee import ScrapingBeeClient
import requests
from bs4 import BeautifulSoup
import pandas as pd

SCRAPINGBEE_API_KEY = "zzzzzzzzz"
endpoint = "https://app.scrapingbee.com/api/v1"
pages = [
    'https://www.businesslist.com.ng/category/restaurants/1/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/2/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/3/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/4/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/5/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/6/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/7/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/8/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/9/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/10/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/11/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/12/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/13/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/14/city:lagos',
    'https://www.businesslist.com.ng/category/restaurants/15/city:lagos'
    ]

rest = []

#GET_LINKS
for url in pages[:1]:
    params = {
    'api_key': SCRAPINGBEE_API_KEY,
    'url': url}

    response = requests.get(endpoint, params=params)
    soup = BeautifulSoup(response.content, 'html.parser')

    body = soup.find_all('h4')
    for items in body:
        item = items.find('a').get('href')
        item_link = 'https://www.businesslist.com.ng'   item
        rest.append(item_link)

#GET_REST
data = []
for url in rest[:2]:
    params = {
    'api_key': SCRAPINGBEE_API_KEY,
    'url': url}
    info = {}
    response = requests.get(endpoint, params=params)
    soup = BeautifulSoup(response.content, 'html.parser')

    restaraunt_name = soup.find('b', {'id':'company_name'}).text
    info.update({'Restaraunt':restaraunt_name})
    location = soup.find('div', {'class':'text location'}).text.split('View Map')[0]
    info.update({'Location':location})
    phone = soup.find('div', {'class':'text phone'}).text[:11]
    info.update({'Phone':phone})    
    web = soup.find('div', {'class':'text weblinks'}).text
    info.update({'web':web})
    data.append(info)

df = pd.DataFrame(data)

df.to_excel('./Lagos.xlsx')