Снятие спотовой ставки с сайта nse - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в веб-поиске и хотел почистить таблицу опционных цепочек (производных валют) от NSE. Я нашел похожий код в этом вопросе: Webscrapping цены на опционы NSE с использованием Python BeautifulSoup, относительно исправления кодировки , но он не извлекает значение (69.4598) над таблицей. Я хочу, чтобы это значение было выделено на изображении, но я не уверен, как извлечь его и закодировать в python. Я прикрепил скриншот веб-страницы вместе с окном элемента Google Inspect.

enter image description here

import requests
import pandas as pd
from bs4 import BeautifulSoup

Base_url = ("https://www.nseindia.com/live_market/dynaContent/live_watch/fxTracker/optChainDataByExpDates.jsp")

page = requests.get(Base_url)

soup = BeautifulSoup(page.content, 'html.parser')
table_it = soup.find_all(class_="opttbldata")
spot = soup.find(id = "td")
table_cls_1 = soup.find_all(id = "octable")
col_list = []

for mytable in table_cls_1:
    table_head = mytable.find('thead')

    try:
        rows = table_head.find_all('tr')
        for tr in rows:
            cols = tr.find_all('th')
            for th in cols:
                er = th.text
                ee = er.encode('utf8')
                col_list.append(ee)
    except:
        print('no thread')

col_list_fnl = [e for e in col_list if e not in ('CALLS', 'PUTS', 'Chart', '\xc2\xa0')]

table_cls_2 = soup.find(id = "octable")
all_trs = table_cls_2.find_all('tr')
req_row = table_cls_2.find_all('tr')

new_table = pd.DataFrame(index=range(0,len(req_row)-3),columns = col_list_fnl)

row_marker = 0

for row_number, tr_nos in enumerate(req_row):
    if row_number <= 1 or row_number == len(req_row)-1:
        continue # To insure we only choose non empty rows

    td_columns = tr_nos.find_all('td')

    # Removing the graph column
    select_cols = td_columns[1:22]
    cols_horizontal = range(0,len(select_cols))

    for nu, column in enumerate(select_cols):

        utf_string = column.get_text()
        utf_string = utf_string.strip('\n\r\t": ')
        tr = utf_string.encode('utf8')

        new_table.iloc[row_marker,[nu]] = tr

    row_marker += 1

print(new_table)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

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

import requests
from bs4 import BeautifulSoup

url = "https://www.nseindia.com/live_market/dynaContent/live_watch/fxTracker/optChainDataByExpDates.jsp"

page = requests.get(url)
soup = BeautifulSoup(page.text,'html.parser')
item = soup.select_one("div:contains('REFERENCE RATE') > strong").text
print(item)

Вывод на данный момент:

69.4222
1 голос
/ 12 июня 2019

Вы можете взять все теги <td> и просмотреть их, чтобы увидеть, где находится подстрока 'REFERENCE RATE - FBIL'.На самом деле он отображается 4 раза, поэтому поместите его в список, а затем просто распечатайте элемент.

import requests
import pandas as pd
from bs4 import BeautifulSoup

Base_url = ("https://www.nseindia.com/live_market/dynaContent/live_watch/fxTracker/optChainDataByExpDates.jsp")

page = requests.get(Base_url)

soup = BeautifulSoup(page.text, 'html.parser')
tds = soup.find_all('td')

refRates = [ each.find('strong').text for each in tds if 'REFERENCE RATE - FBIL' in each.text ]
print (refRates[0])

Вывод:

print (refRates[0])
69.4598
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...