Как использовать BeautifulSoup для извлечения содержимого диапазона с помощью data-reactid? - PullRequest
0 голосов
/ 09 мая 2020

Я хочу извлечь Market Cap из этого финансового веб-сайта Yahoo.

enter image description here

enter image description here

Я использовал

from bs4 import BeautifulSoup
import requests
url='https://finance.yahoo.com/quote/TXG?p=TXG&.tsrc=fin-srch'
wb_data=requests.get(url)
soup=BeautifulSoup(wb_data.text,'lxml')
cap = soup.find("span", class_ = "Trsdu(0.3s) ").get_text()
print(cap)

Но я получил 80.81 (что означает «Предыдущее закрытие») вместо 8.01B. Это потому, что «Предыдущее закрытие» принадлежит к тому же классу. Поэтому я пытаюсь ограничить поиск, используя data-reactid. Как этого добиться?

Я получил ответ, но он такой странный, это attrs = {"data-reactid": "57"} вместо 139!

Ответы [ 2 ]

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

Функция find обрабатывает любой неизвестный аргумент ключевого слова как фильтр атрибута, поэтому, чтобы найти элемент, атрибут id которого равен foo, вы должны написать:

soup.find(id = "foo")

You can ' • Используйте data-class в качестве аргумента ключевого слова напрямую, потому что дефис делает его недопустимым идентификатором в Python. Но BeautifulSoup поможет вам :

cap = soup.find("span", class_ = "Trsdu(0.3s) ", attrs = {"data-reactid": "85"})

Обратите внимание, что зависимость от идентификаторов React, вероятно, очень хрупкая, поэтому может быть лучше вместо этого полагаться на окружающие элементы, такие как метка «рыночная капитализация». .

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

Попробуйте следующее:

from bs4 import BeautifulSoup
import requests
url='https://finance.yahoo.com/quote/TXG?p=TXG&.tsrc=fin-srch'
wb_data=requests.get(url)
soup=BeautifulSoup(wb_data.text,'lxml')
cap = soup.find("span", class_ = "Trsdu(0.3s) ").get('data-reactid')
print(cap)
...