Карусель генерируется из Javascript с использованием данных JSON, жестко закодированных в JS. Точно, этот JSON представлен с:
window.__REDUX_STATE__= { ..... }
Итак, предположительно, к вашему сведению, этот сайт использует redux для управления состоянием приложения
Мы можем просто извлечь этот JSONс помощью следующего сценария:
import requests
from bs4 import BeautifulSoup
import json
import pprint
r = requests.get('https://yourstory.com/')
prefix = "window.__REDUX_STATE__="
soup = BeautifulSoup(r.content, "html.parser")
#get the redux state (json)
data = [
json.loads(t.text[len(prefix):])
for t in soup.find_all('script')
if "__REDUX_STATE__" in t.text
]
#get only the section with cardType == "CarouselCard"
carouselCards = [
t["data"]
for t in data[0]["home"]["sections"]
if ("cardType" in t) and (t["cardType"] == "CarouselCard")
][0]
#print all cards
pprint.pprint(carouselCards)
#get the name, image path & link path
print([
(t["title"], t["path"], t["metadata"]["thumbnail"])
for t in carouselCards
])
JSON имеет массив sections
внутри поля home
. Этот объект раздела содержит некоторый объект со значением cardType
со значением CarouselCard
, где есть данные, которые вы ищете
Кроме того, из JSON раздел карусели начинается следующим образом:
{
"type":"content",
"dataAPI":"/api/v2/featured_stories?brand=yourstory&key=CURATED_SET",
"dataAttribute":"featured",
"cardType":"CarouselCard",
"data":[]
}
Итак, я полагаю, вы могли бы просто получить карты, используя API: https://yourstory.com/api/v2/featured_stories?brand=yourstory&key=CURATED_SET
import requests
r = requests.get('https://yourstory.com/api/v2/featured_stories?brand=yourstory&key=CURATED_SET')
#get the name, image path & link path
print([
(t["title"], t["path"], t["metadata"]["thumbnail"])
for t in r.json()["stories"]
])
, что более просто