Как получить сектор компании фондового рынка из тикера или названия компании в python

Учитывая тикер или название компании, я хотел бы получить ее сектор с помощью python.

Я пробовал уже несколько потенциальных решений, но ни одно из них не сработало.

Двумя наиболее перспективными являются:

1) Используя скрипт из: https://gist.github.com/pratapvardhan/9b57634d57f21cf3874c

from urllib import urlopen
from lxml.html import parse

'''
Returns a tuple (Sector, Indistry)
Usage: GFinSectorIndustry('IBM')
'''
def GFinSectorIndustry(name):
  tree = parse(urlopen('http://www.google.com/finance?&q='+name))
  return tree.xpath("//a[@id='sector']")[0].text, tree.xpath("//a[@id='sector']")[0].getnext().text

Однако я использую python --version 3.8

Я смог настроить это решение, но последняя строка не работает, и я совершенно новичок в очистке веб-страниц, поэтому я был бы признателен, если бы у кого-нибудь были какие-то предложения.

Вот мой текущий код:

from urllib.request import Request, urlopen
from lxml.html import parse

name="IBM"
req = Request('http://www.google.com/finance?&q='+name, headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req)

tree = parse(webpage)

Но тогда последняя часть не работает, и я очень новичок в этом синтаксисе xpath:

tree.xpath("//a[@id='sector']")[0].text, tree.xpath("//a[@id='sector']")[0].getnext().text

2) Другим вариантом было встраивание пакета TTN R, как показано здесь: акции принадлежат

Тем не менее, я хочу запустить его в своем блокноте Jupyter, а для запуска требуется много времени ss <- stockSymbols()


person alejandro    schedule 16.06.2020    source источник
comment
Не существует тега a, id которого является сектором, скажем, на www. google.com/search?q=MSFT. У вас есть конкретный пример того, что вы действительно хотите получить? Если да, то обогатите свой вопрос такой точностью.   -  person keepAlive    schedule 17.06.2020
comment
@keepAlive, например отсюда: marketwatch.com/investing/stock/ibm. хотите получить сектор, а именно: Business/Consumer Services. Это показано в левой части графика, ниже цены акций.   -  person alejandro    schedule 17.06.2020


Ответы (3)


После вашего комментария для marketwatch.com/investing/stock в частности, xpath, который, скорее всего, будет работать, "//div[@class='intraday__sector']/span[@class='label']" означает, что выполнение

tree.xpath("//div[@class='intraday__sector']/span[@class='label']")[0].text

должен вернуть желаемую информацию.

Я совершенно новичок в очистке веб-страниц [...]

Некоторые уточнения:

  1. Этот xpath полностью зависит от веб-сайта, который вы просматриваете, что объясняет, почему не было никакой надежды на поиск "//a[@id='sector']" на странице, которую вы упоминаете в комментариях, поскольку этот xpath (теперь устаревший) был специфичен для Google-финансов. Иными словами, вам сначала нужно «изучить» интересующую вас страницу, чтобы узнать, где находится нужная вам информация.
  2. Для проведения такого «исследования» я использую Chrome DevTools и проверяю все xpath в консоль, выполняя $x(<your-xpath-of-interest>), где функция $x задокументирована здесь (с примерами!).
  3. К счастью для вас, информацию вы хотите получить с сайта marketwatch.com/investing/stock. -- имя сектора -- генерируется статически (т. е. не генерируется динамически при загрузке страницы, в этом случае потребовались бы другие методы очистки, прибегая к другим библиотекам Python, таким как Selenium.. но это уже другой вопрос).
person keepAlive    schedule 16.06.2020
comment
Это tree.xpath("//div[@class='intraday__sector']/span[@class='label']") дает пустое list. Из переменной tree, созданной с помощью кода вопроса с помощью веб-сайта Google. - person alejandro; 17.06.2020
comment
@alejandro Xpath, который работает для данного веб-сайта, не будет работать для другого веб-сайта. Это работает для marketwatch.com/investing/stock. Смотрите обновление. - person keepAlive; 17.06.2020
comment
да, я понял, но когда я попытался сделать это для этого веб-сайта, я получил следующую ошибку: HTTPError: HTTP Error 405: Method Not Allowed. Кажется, это связано с urlopen частью кода. - person alejandro; 17.06.2020
comment
@al обратите внимание, что ошибка 405 не зависит от основной темы вашего сообщения. При этом вы видели это? - person keepAlive; 17.06.2020
comment
Я действительно смотрел на это ;) Хорошо, тогда я продолжу устранение неполадок! Спасибо за ваш хороший ответ, как только я закончу с этим, я соглашусь, если все работает правильно. - person alejandro; 17.06.2020

Чтобы ответить на вопрос:

Как получить сектор компании фондового рынка из тикера или названия компании в python?

Мне пришлось найти обходной путь после прочтения некоторых материалов и некоторых хороших предложений от @keepAlive.

Следующее выполняет работу в обратном порядке, то есть получает компании данного сектора. Существует 10 секторов, так что не составит труда получить информацию обо всех секторах: https://www.stockmonitor.com/sectors/

Учитывая, что marketwatch.com/investing/stock выдавал ошибку 405, я решил использовать https://www.stockmonitor.com/sectors/, например:

https://www.stockmonitor.com/sector/healthcare/

Вот код:

import requests

import pandas as pd

from lxml.html import parse
from urllib.request import Request, urlopen

headers = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)" + " "
    "AppleWebKit/537.36 (KHTML, like Gecko)" + " " + "Chrome/35.0.1916.47" +
    " " + "Safari/537.36"
]

url = 'https://www.stockmonitor.com/sector/healthcare/'

headers_dict = {'User-Agent': headers[0]}
req = Request(url, headers=headers_dict)
webpage = urlopen(req)

tree = parse(webpage)
healthcare_tickers = []
for element in tree.xpath("//tbody/tr/td[@class='text-left']/a"):

    healthcare_tickers.append(element.text)

pd.Series(healthcare_tickers)

Таким образом, healthcare_tickers владеет акционерными обществами в секторе здравоохранения.

person alejandro    schedule 17.06.2020

Вы можете легко получить сектор для любой компании/тикера с Yahoo Finance:

import yfinance as yf

tickerdata = yf.Ticker('TSLA') #the tickersymbol for Tesla
print (tickerdata.info['sector'])

Код возвращает: «Потребительский циклический»

Если вам нужна другая информация о компании/тикере, просто напечатайте(tickerdata.info), чтобы увидеть все другие возможные ключи словаря и соответствующие значения, такие как ['sector'], используемые в приведенном выше коде.

person oo7knutson    schedule 30.11.2020