首页 > 解决方案 > 在要抓取的网站上找不到 BeautifulSoup 的类名

问题描述

我是美丽汤的新手。

我正在尝试在下面的链接中获取“排名标准”​​类。不幸的是,我使用“标准”作为 soup_findAll() 的类,但它没有显示任何内容。我找不到任何其他可以给我想要的数据的班级名称(总分、学术声誉等)

我实际上想为多所大学做网络爬虫,所以我希望使用我可以为多所大学格式化的 URL(只需更改大学名称)。否则,我将只使用outerHTML(经过测试并且有效,但我不知道如何为多所大学定制)

我的代码如下。我最终使用了 get_text():

r = requests.get("https://www.topuniversities.com/universities/california-institute-technology-caltech")
html = r.text
soup = BeautifulSoup(html, 'html.parser')
tds = soup.get_text()

print(tds)

它并不成功,因为它有太多的东西让我很难评估我想要的信息。

任何帮助将不胜感激!谢谢!

我试图抓取的链接:

标签: python-3.xbeautifulsoup

解决方案


数据通过 JavaScript Ajax 请求动态加载。但是你可以使用requests模块来模拟它。

例如:

import requests
from bs4 import BeautifulSoup

url = 'https://www.topuniversities.com/universities/california-institute-technology-caltech'

soup = BeautifulSoup( requests.get(url).content, 'html.parser' )
ajax_url = 'https://www.topuniversities.com' + soup.select_one('a.use-ajax')['href'].replace('nojs', 'ajax')
data = requests.post(ajax_url).json()

for d in data:
    if 'data' in d:
        soup = BeautifulSoup(d['data'], 'html.parser')
        break

for div in soup.select('div.criteria'):
    criteria = div.find(text=True).strip()
    ranking = div.b.get_text(strip=True)
    print('{:<30} {}'.format(criteria, ranking))

印刷:

Overall Score:                 97
Academic Reputation:           97
Employer Reputation:           82.8
Faculty Student:               100
Citations per Faculty:         99.9
International Faculty:         100
International Students:        88.2

推荐阅读