Я пытаюсь использовать pandas и BeautifulSoup для создания набора данных в краудсорсинговых кампаниях. URL-адреса для всех страниц, которые я хочу просмотреть, хранятся в текстовом файле с тремя столбцами, разделенными табуляцией: url, position (позиция кампании на главной странице) и категория. Моя цель - l oop по каждому URL и сохранить URL, категорию, положение и другую информацию в качестве переменных в новом наборе данных. Я могу получить код ниже, чтобы работать, когда я запускаю его на одном URL, но когда я пытаюсь l oop над URL-адресами, я получаю следующую ошибку:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-2a05d3cebea0> in <module>
21 position = df['position'].tolist()
22
---> 23 for url, category, position in zip(url, category, position):
24
25 page = requests.get(url)
TypeError: 'str' object is not callable
Я предполагаю, Проблема связана с моим чтением в URL-адресах из файла .txt в виде списка, но я не уверен, как мне следует изменить код так, чтобы «url» вызывался. Это полный код.
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from time import sleep
import requests
import json
df = pd.read_csv('url_list_01.txt', sep = " ", delimiter= None)
# Dropping row number column because I don't actually need it, it was just there
df = df.drop(columns=['row'])
# Converting columns into lisst so I can loop over them.
for newcol in ['title','zip','amount_raised','goal','donations','campaign_start','shares','hearts','text']:
df[newcol]=0
url = df['url'].tolist()
category = df['category'].tolist()
position = df['position'].tolist()
for url, category, position in zip(url, category, position):
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')
page = page.content
df['title'] = soup.find_all('h1', class_='a-campaign-title')[0].get_text()
zip = str(page,'utf-8').split('postal_code":"')[1]
df['zip'] = zip.split('"},"is_partner')[0]
amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()
df['amount_raised'] = amount_raised.split(" ")[0]
goal = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()
df['goal'] = goal.split(" ")[0]
donations = str(page,'utf-8').split('donation_count":')[1]
df['donations'] = donations.split(',"comments_enabled"')[0]
campaign_start = str(page,'utf-8').split('launch_date":')[1]
df['campaign_start'] = campaign_start.split(',"campaign_hearts"')[0]
shares = str(page,'utf-8').split('social_share_total":')[1]
df['shares'] = shares.split(',"social_share_last_update"')[0]
hearts = str(page,'utf-8').split('campaign_hearts":')[1]
df['hearts'] = hearts.split(',"social_share_total"')[0]
df['text'] = soup.find_all('div', class_='o-campaign-story')[0].get_text()
df['url'] = url
df['category'] = category
df['position'] = position
df.to_csv('data_01.csv', mode = 'a', header = 'column_names', sep=',', line_terminator='\n')
Заранее спасибо за любую помощь.