Очистка элементов строки из динамической таблицы с помощью Bs4 - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь вычистить список тикеров для Nasdaq 100 с сайта CNBC: https://www.cnbc.com/nasdaq-100/. Я новичок в прекрасном супе, но если есть более простой способ очистить список и сохранить Данные меня интересуют в любом решении. Приведенный ниже код не возвращает ошибку, однако он также не возвращает никаких тикеров.

import bs4 as bs
import pickle # serializes any python object so that we do not have to go back to the CNBC website to get the tickers each time we want 
# to use the 100 ticker symbols

import requests
    def save_nasdaq_tickers():
        ''' We start by getting the source code for CNBC. We will use the request module for this'''
        resp = requests.get('https://www.cnbc.com/nasdaq-100')
        soup = bs.BeautifulSoup(resp.text,"lxml")# we use txt when the response comes from request module I think because resp.txt is text of source code.
        table = soup.find('table',{'class':"data quoteTable"}) # We want all table of the class we think matches the table data we want from cnbc
        tickers = [] # empty tickers list
        # Next week iterate through the table.
        for row in table.findAll('tr')[1:]:# we want to find all table rows except the header row which should be row 0 so 1 onward [:1]
            ticker = row.findAll('td')[0].txt #td is the columns of the table 0 is the first column which I perceived to be the tickers
       # We specifiy .txt because it is a soup object
            tickers.append(ticker)
        # Save this list of tickers using pickle and with open???
        with open("Nasdaq100Tickers","wb") as f: # name the file Nasdaq100... etc 
            pickle.dump(tickers,f) # dumping the tickers to file f

        print(tickers)

        return tickers
    save_nasdaq_tickers()

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы можете имитировать сделанный запрос XHR и анализировать JSON, содержащий данные, которые вы после

import requests
import pandas as pd
import json
from pandas.io.json import json_normalize
from bs4 import BeautifulSoup

url = 'https://quote.cnbc.com/quote-html-webservice/quote.htm?partnerId=2&requestMethod=quick&exthrs=1&noform=1&fund=1&output=jsonp&symbols=AAL|AAPL|ADBE|ADI|ADP|ADSK|ALGN|ALXN|AMAT|AMGN|AMZN|ATVI|ASML|AVGO|BIDU|BIIB|BMRN|CDNS|CELG|CERN|CHKP|CHTR|CTRP|CTAS|CSCO|CTXS|CMCSA|COST|CSX|CTSH&callback=quoteHandler1'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
s = soup.select('html')[0].text.strip('quoteHandler1(').strip(')')
data= json.loads(s)
data = json_normalize(data)
df = pd.DataFrame(data)
print(df[['symbol','last']]) 

Возвращает JSON следующим образом (образец расширен):

image

0 голосов
/ 19 ноября 2018

Просто небольшая ошибка в вашем коде, если вы удивляетесь, почему у вас ничего нет в вашем tickers. ticker = row.findAll('td')[0].txt до ticker = row.findAll('td')[0].text. Но когда вы хотите получить полный контент на динамической странице, вам нужно selenium.

def save_nasdaq_tickers():
    try:
        dr = webdriver.Chrome()
        dr.get("https://www.cnbc.com/nasdaq-100")
        text = dr.page_source
    except Exception as e:
        raise e
    finally:
        dr.close()
    soup = bs.BeautifulSoup(text,"lxml")
    table = soup.find('table',{'class':"data quoteTable"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...