Как получить сектор компании фондового рынка по тикеру или названию компании в python - PullRequest
1 голос
/ 17 июня 2020

Учитывая компанию тикер или название, я хотел бы получить его сектор , используя 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()

Ответы [ 2 ]

1 голос
/ 17 июня 2020

После вашего комментария для 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-financial c. Другими словами, вам сначала нужно «изучить» интересующую вас страницу, чтобы узнать, где находится нужная вам информация.
  2. Для проведения такого «исследования» я использую Chrome DevTools и проверьте любой xpath в консоли, выполнив $x(<your-xpath-of-interest>), где задокументирована функция $x здесь (с примерами!).
  3. К счастью для вас, информация, которую вы хотите получить marketwatch.com / investing / stock - название сектора - генерируется статически (т.е. не генерируется динамически при загрузке страницы, в этом случае потребовались бы другие методы очистки, прибегая к другим python библиотеки типа Selenium .. но это уже другой вопрос).
0 голосов
/ 18 июня 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 имеет акционерные общества в секторе здравоохранения .

...