Python BeautifulSoup: Как перемещаться по таблице в нескольких div - PullRequest
0 голосов
/ 15 марта 2020

Я искал по форуму и учебным видео, но я не могу понять это. Я пытаюсь собрать информацию об опциях на barchart.com с помощью BeautifulSoup, но не могу отобразить таблицу в моем супе. Я пробовал несколько парсеров, но не могу заставить его появиться. Цель состоит в том, чтобы затем поместить эту информацию в фрейм данных.

При проверке источника страницы я получаю самое дальнее. В этом теге лежит таблица нескольких поколений. Таблица лежит в.

soup.findAll не работает, так как тег не появляется в супе. Вот расположение таблицы: Расположение таблицы

Извините, если вопрос очевиден, я новичок в этом. Спасибо

Текущий код:

from bs4 import BeautifulSoup
import requests

headers = requests.utils.default_headers()
headers.update({
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
})

# def get_options(ticker, date):
ticker = 'TSLA'
date = '2020-03-20'

webpage_response = requests.get(
    'https://www.barchart.com/stocks/quotes/' + str(ticker) + '/options?moneyness=allRows&expiration=' + str(date),
    headers=headers)

webpage = webpage_response.content
soup = BeautifulSoup(webpage, "lxml")


print(soup.prettify())

# find table from barchart.com

Ответы [ 2 ]

1 голос
/ 16 марта 2020
import requests
from bs4 import BeautifulSoup
import csv


def Main():
    with requests.Session() as req:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'}
        r = req.get(
            "https://www.barchart.com/stocks/quotes/TSLA/options?moneyness=allRows&expiration=2020-03-20", headers=headers)
        headers["X-XSRF-TOKEN"] = r.cookies.items()[0][1]
        headers["Accept"] = "application/json"
        r = req.get("https://www.barchart.com/proxies/core-api/v1/options/get?symbol=TSLA&fields=strikePrice%2ClastPrice%2CpercentFromLast%2CbidPrice%2Cmidpoint%2CaskPrice%2CpriceChange%2CpercentChange%2Cvolatility%2Cvolume%2CopenInterest%2CoptionType%2CdaysToExpiration%2CexpirationDate%2CtradeTime%2CsymbolCode%2CsymbolType&groupBy=optionType&expirationDate=2020-03-20&meta=field.shortName%2Cexpirations%2Cfield.description&raw=1", headers=headers).json()
        with open("lala.csv", "w", newline="") as f:
            writer = csv.writer(f)
            writer.writerow(list(r["data"]["Call"][0].keys())[:-1])
            for data in r["data"]["Call"]:
                writer.writerow(list(data.values())[:-1])


Main()

Вывод: проверка онлайн

0 голосов
/ 15 марта 2020

Если вы выберете тег в таблице и просто найдете его в переменной «webpage», его там не будет (по крайней мере, не для меня).

Похоже, контент - это Dynami c, поэтому я бы использовал Selenium. Мне удалось найти таблицу с кодом ниже.

import time, os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# use google chrome
driver = webdriver.Chrome()

# go to your website
driver.get('https://www.barchart.com/stocks/quotes/' + str(ticker) + '/options?moneyness=allRows&expiration=' + str(date))

# wait for all the dynamic content to load
time.sleep(1)

# soup it
soup = BeautifulSoup(driver.page_source, 'html.parser')

# find the table body
soup.FindAll('tbody')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...