Ошибка: объект str 'не вызывается при попытке l oop по списку с помощью Beautifulsoup - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь использовать 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')

Заранее спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...