#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