Beautiful Soup Feature NotFound проблема - PullRequest
0 голосов
/ 26 мая 2020
import requests
from bs4 import BeautifulSoup

r = requests.get('https://ca.finance.yahoo.com/quote/AMZN/profile?p=AMZN')
soup = BeautifulSoup(r.content, 'html.parser')
price = soup.find_all('div', {'class':'My(6px) Pos(r) smartphone_Mt(6px)'})
print(price)

Итак, я новичок в изучении BeautifulSoup, но меня немного смущает, почему это возвращает:

[]

Сделал ли я ошибку в своем коде или BeautifulSoup не принимает код веб-сайта ? Также всякий раз, когда я пробую что-то вроде 'xml' или 'l xml' вместо 'html .parser', я получаю ошибку как таковую:

bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Данные хранятся внутри в переменной JavaScript. Вы можете использовать модули re и json для извлечения информации.

Например:

import re
import json
import requests

url = 'https://ca.finance.yahoo.com/quote/AMZN/profile?p=AMZN'

html_data = requests.get(url).text

data = json.loads(re.search(r'root\.App\.main = ({.*?});\n', html_data).group(1))

# uncomment this to print all data:
# print(json.dumps(data, indent=4))

price = data['context']['dispatcher']['stores']['QuoteSummaryStore']['price']['regularMarketPrice']['fmt']
currency_symbol = data['context']['dispatcher']['stores']['QuoteSummaryStore']['price']['currencySymbol']

print('{} {}'.format(price, currency_symbol))

Печать:

2,436.88 $
0 голосов

Вы можете переключиться на анализатор L XML, выполнив эту команду в Терминале или командной строке:

pip install lxml

Затем попробуйте следующее:

soup = BeautifulSoup(html, "lxml")

См. Документ

Для получения дополнительной информации: Перейти на эту страницу

0 голосов
/ 26 мая 2020

Как было предложено @SD и @xeon zolt, проблема, похоже, в том, что контент, который вы ищете, генерируется скриптами. Чтобы Beautiful Soup проанализировал это, мы должны загрузить веб-страницу с помощью браузера, а затем передать источник страницы в Beautiful Soup.

Из вашего комментария я предполагаю, что вы уже настроили Selenium. Вы можете загрузить страницу в Selenium, а затем передать источник страницы красивому супу как таковому:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox()

driver.get("https://ca.finance.yahoo.com/quote/AMZN/profile?p=AMZN")

wait = WebDriverWait(driver, 5)

page_source = driver.page_source

driver.close()

soup = BeautifulSoup(page_source, 'html.parser')

Кроме того, безголовый режим просто означает, что видимые элементы пользовательского интерфейса (например, открытие браузера, затем закрытие) не видны при запуске скрипта. Вы можете использовать безголовый режим, изменив код, включив в него следующее:

from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = True

driver = webdriver.Firefox(options=options)

Чтобы ответить на ваш последний вопрос, перед использованием нового парсера вы должны его установить. Например, если вы хотите использовать парсер l xml, вы должны сначала запустить в командной строке:

$ pip install lxml

Надеюсь, это поможет!

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