«должно быть str, а не list» при попытке очистить Yahoo Finance от массива

#python #web-scraping

#python #веб-очистка

Вопрос:

Я начинаю свое обучение программированию на Python, поэтому я сталкиваюсь с основной ошибкой, в которой я не могу разобраться, почему

Идея состоит в том, чтобы пройти через массив «акции» и получить их текущую цену из Yahoo с помощью веб-очистки

stocks = 0 GGBR4 1 MRVE3 2 TAEE11 3 MGLU3 4 HAPV3

Мой код:

 #Workbook selection   sheet selection   range of stocks from the excel
workbook = gc.open_by_key('1DexwEtIPc2yA94QiWzWGR3ZZWo7YIZc00UX1CTMpdB8')
worksheet = workbook.worksheet('summary')
stocks = worksheet.get('stock_range')
df = pd.DataFrame.from_records(stocks)

for i in range(len(stocks)):
 symbol = stocks[i]
 url = 'https://finance.yahoo.com/quote/'   symbol   '.SA'
 data = requests.get(url)
 soup = bs4.BeautifulSoup(data.text, "html.parser")
 price = soup.findAll('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'})[0].find('span').text
  

Сообщение об ошибке, которое я получаю:

 TypeError                                 Traceback (most recent call last)
<ipython-input-8-fae00e25d5a8> in <module>()
      1 for i in range(len(stocks)):
      2   symbol = stocks[i]
----> 3   url = 'https://finance.yahoo.com/quote/'   symbol   '.SA'
      4   data = requests.get(url)
      5   soup = bs4.BeautifulSoup(data.text, "html.parser")

TypeError: must be str, not list
  

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

1. можете ли вы точно показать, что stocks есть? Это строка? Список строк? Список списков?

2. Просто поместите оператор печати перед строкой URL и посмотрите значение и тип символа. print(symbol, type(symbol)) . Также проверьте, правильно ли отформатирован список stocks , напечатав его значение и тип

3. Из вашего кода неясно, каково значение переменной stocks . Предполагается, что это список строк, но ошибка, которую вы получаете, указывает на то, что это не так.

Ответ №1:

Я запустил ваш пример с корректировкой в вашем списке акций, и он работает нормально:

 import requests
import bs4

stocks = ['GGBR4', 'MRVE3', 'TAEE11', 'MGLU3', 'HAPV3']

for i in range(len(stocks)):
  symbol = stocks[i]
  url = 'https://finance.yahoo.com/quote/'   symbol   '.SA'
  data = requests.get(url)
  soup = bs4.BeautifulSoup(data.text, "html.parser")
  price = soup.findAll('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'})[0].find('span').text
  

Однако вам не нужно извлекать индексы для запуска через список. Следующий метод имеет больше смысла и немного более удобочитаем:

 import requests
import bs4

stocks = ['GGBR4', 'MRVE3', 'TAEE11', 'MGLU3', 'HAPV3']

for symbol in stocks
  url = 'https://finance.yahoo.com/quote/'   symbol   '.SA'
  data = requests.get(url)
  soup = bs4.BeautifulSoup(data.text, "html.parser")
  price = soup.findAll('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'})[0].find('span').text