почему BeautifulSoup соответствует некоторым именам классов, но не другим - PullRequest
0 голосов
/ 02 марта 2019

Я изо всех сил пытаюсь понять, почему BeautifulSoup не соответствует некоторым именам классов, которые существуют в источнике HTML.

Исходный HTML-код содержит следующие строки для сопоставления:

<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="34">1,148.52</span>

<div class="Py(16px)">...

<div class="Mt(15px)" data-reactid="4">...

Ниже приведен мой код:

# ref: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class 

import requests
from bs4 import BeautifulSoup

page = requests.get("https://finance.yahoo.com/quote/GOOGL/")
soup = BeautifulSoup(page.content, 'html.parser')

# the folowing matches ok
print(soup.find('div', class_="Mt(15px)"))

# yet, the following lines fail to match:
print(soup.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"))
print(soup.find('span', {"class": "Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"}))
print(soup.find('div', class_="Py(16px)"))

Я подумал, что имена классов не являютсяработая с BeautifulSoup, поэтому я попытался использовать page.content.replace («имя старого класса», «новый»), чтобы сократить и упростить имена классов для функции BeautifulSoup, но это не сработало.

1 Ответ

0 голосов
/ 02 марта 2019

Не совсем надежный, но вы можете получить эту информацию на одной из вкладок скрипта

import requests
import json
from bs4 import BeautifulSoup as bs

res = requests.get('https://finance.yahoo.com/quote/GOOGL?p=GOOGL')
soup = bs(res.content, 'lxml')
scripts = [script.text for script in soup.select('script') if '/* -- Data -- */' in script.text]
script = scripts[0].split('App.main = ')[1].replace('\n','').replace(';}(this));','')
data = json.loads(script)
content = data['context']['dispatcher']['stores']['StreamDataStore']['quoteData']['GOOGL']

print(content['longName'])
print(content['regularMarketPrice']['fmt'])
print(content['regularMarketChange']['fmt'])
print(content['regularMarketChangePercent']['fmt'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...