您如何在bs4中找到div元素?

时间:2019-05-12 00:05:55

标签: python html web-scraping beautifulsoup

我正在制作一个python脚本,以提供网站scratch.mit.edu上排名前5位的特色项目。我正在使用请求来获取数据。具有这些项目标题的元素位于div标记中,但是当我使用bs4时,它不显示div标记的子代或后代。如何查看标签内部?

我已经尝试过find_all(),find()、. descendant和.children。

soup.find("div").children

我希望输出

1 个答案:

答案 0 :(得分:1)

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标签,并索引到前5个/或df.head()的列表中。

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

py(如@ P.hunter所述-您可以无头运行)

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)