Как вы находите внутри элемента div с bs4? - PullRequest
0 голосов
/ 12 мая 2019

Я делаю скрипт на python, чтобы дать 5 лучших проектов на сайте scratch.mit.edu. Я использую запросы для получения данных. Элемент, который имеет название этих проектов, находится в теге div, но когда я использую bs4, он не отображает дочерние элементы или потомки тега div. Как я могу заглянуть внутрь тега?

Я пробовал find_all (), find (), .descendants и .children.

soup.find("div").children

Я ожидал вывода

1 Ответ

1 голос
/ 12 мая 2019

API

Используйте API-интерфейс страницы для обновления содержимого и анализа ответа json

https://api.scratch.mit.edu/proxy/featured

import requests
import pandas as pd

r = requests.get('https://api.scratch.mit.edu/proxy/featured').json()
project_info  = [(item['title'], 'https://scratch.mit.edu/projects/' + str(item['id'])) for item in r['community_featured_projects'][:6]]
df = pd.DataFrame(project_info , columns = ['Title', 'Link'])
print(df.head())

Селен

Или, неоптимальный выбор, так как контент динамически отображается, вы можете использовать метод, подобный селену:

Ограничьте первое поле, а затем выберите дочерние теги a классов thumbnail-title и внесите указатель в список для top 5 / или df.head ()

.box:nth-of-type(1) .thumbnail-title > a

py (как заметил @Phunter - вы можете запустить это без головы)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import pandas as pd

options = Options()  
options.add_argument("--headless") 

d = webdriver.Chrome(options = options)
d.get('https://scratch.mit.edu/')
project_info = [(item.get_attribute('title') ,item.get_attribute('href') ) for item in  WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".box:nth-of-type(1) .thumbnail-title > a")))]
df = pd.DataFrame(project_info , columns = ['Title', 'Link'])
d.quit()
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...