Почему мой html-парсер не загружает всю html-документацию? - PullRequest
3 голосов
/ 13 июня 2019

Я использую Beautiful Soup, чтобы очистить следующую страницу: https://www.nyse.com/quote/XNYS:AAN

Я хочу, чтобы стоимость акций была ниже названия + аббревиатура.Однако, когда я запускаю сценарий, кажется, что soup.find() не работает, потому что не загружается весь HTML-файл.

main_url = "https://www.nyse.com/quote/XNYS:AAN"

import requests
result = requests.get(main_url)

from bs4 import BeautifulSoup
soup = BeautifulSoup(result.text, 'html.parser')

print(soup.find("div", class_ = "d-dquote-symbol").prettify())

Я ожидаю увидеть <div>, который содержит <span> с правильной стоимостью акций.Однако печать возвращает «нет», поскольку сценарий не может найти этот тег.Я знаю, что он существует, потому что я использовал inspect element, чтобы найти тег.

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Это происходит потому, что страница, которую вы копируете, не является статичной.

вы можете увидеть, что у нее есть «счетчик» перед отображением значений, или просмотрев вкладку network в инструментах отладки вашего браузера..

requests.get не делает никаких «последующих» запросов, поэтому вы получаете только пустую страницу.

, чтобы получить стоимость акций (с помощью HTML-кода ...), вам следуетиспользуйте запрос, который сам сайт использует для получения стоимости акций.

ПРИМЕЧАНИЕ: для получения структурированных данных такого типа лучше искать официальный API.

0 голосов
/ 13 июня 2019

Вы можете использовать любой браузер симулятор, чтобы получить цитату. pyppeteer может быть хорошим выбором, чтобы сделать трюк. Сценарий будет ждать, пока цитата станет доступной, а затем проанализирует ее.

import asyncio
from pyppeteer import launch

url = "https://www.nyse.com/quote/XNYS:AAN/QUOTE"

async def get_quote(link):
    wb = await launch()
    page = await wb.newPage()
    await page.goto(link)
    await page.waitForSelector(".d-dquote-bigContainer [class^='d-dquote-x']")
    container = await page.querySelector(".d-dquote-bigContainer [class^='d-dquote-x']")
    quote = await page.evaluate('(element) => element.innerText', container)
    print(quote)

asyncio.get_event_loop().run_until_complete(get_quote(url))

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

60.09
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...