

pythonで以下のページをスクレイピングし、大学ランキングのoverall、他要素を抽出しようと思っています。

<https://www.topuniversities.com/university-rankings/university-subject-
rankings/2020/arts-humanities>

selenium BeautifulSoupを用いてコードを書いたのですが、該当タブにアクセスはできるものの文字を抽出できず、困っている状況です。

[code]

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    
    driver= webdriver.Chrome()
    
    url='https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/arts-humanities'
    
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    found = soup.find('div', class_='tab-content')
    s = found.find('div', id='ranking-data-load_ind')
    a = s.findAll('div', class_='row ind-row')
    print(a)
    
    -->[]
    
[/code]

どうぞよろしくお願いいたします。


CC BY-SA 4.0
2021-10-28T01:33:08.727
83290
2021-10-28T02:37:35.847
48838
question
python html web-scraping
Pythonで大学ランキングのスクレイピング


対象のウェブページの HTML ソースを眺めてみると、ランキングの部分は JavaScript で動的に生成しています。

[code]

    <script id="ranking-row-html_ind" type="text/html">
       <div class="row ind-row">
                  :
    
[/code]

なので、`div` 要素がレンダリングされるまで待つとよろしいかと思います。

以下は `Selenium 4.0.0`, `BeautifulSoup4 4.10.0` を使用していますが、`Selenium 4` から API
の一部が変更されています。また、`headless` モードを指定しています。

[code]

    from selenium import webdriver
    from selenium.webdriver.chrome import service as cs
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from bs4 import BeautifulSoup
    
    chrome_service = cs.Service(executable_path='/usr/local/bin/chromedriver')
    opts = webdriver.ChromeOptions()
    opts.headless = True
    driver = webdriver.Chrome(service=chrome_service, options=opts)
    
    url='https://www.topuniversities.com/university-rankings/university-subject-rankings/2020/arts-humanities'
    driver.get(url)
    
    # wait until div tag rendered
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'ind-row')))
    
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    
    found = soup.find('div', class_='tab-content')
    s = found.find('div', id='ranking-data-load_ind')
    a = s.findAll('div', class_='row ind-row')
    print(a)
    
    # 出力結果
    [<div class="row ind-row">
    <div class="col-lg-12">
    <div class="_qs-ranking-data-header-new-white">
    <div class="row">
    <div class="col-lg-5 _right_background">
                  :
    
[/code]


CC BY-SA 4.0
2021-10-28T02:37:35.847
83294
2021-10-28T02:37:35.847
47127
83290
answer