96331


Rでwebスクレイピングを行っているのですが, 抽出したいデータが変数内に入りません.  
抽出したいのは, テーブル型のデータです.  
サイトは, 東京都教育委員会の都立高校検索のサイトで、アクセスのところの駅・路線・所要時間のデータを抽出したいと考えております.

使用したライブラリ：rvest  
Rのバージョン：R 4.2.1  
使用したOS：macOS

以下にコードを添付します.

[code]

    library(rvest)
    
    html <- read_html("https://www.kyoiku.metro.tokyo.lg.jp/static/high_school/index.html?", encoding= "UTF-8")
    Sys.sleep(1)
    tbl <- html_nodes(html, xpath="//*[id=hitList]/div[1]/div[2]/div/table")
    
[/code]

この後, html_table()を用いたいと思ったのですが, 上記のtblの段階で, データが空になってしまいます.  
tblにデータが入るようにするには、どのようにしたら良いでしょうか.  
ご回答お待ちしております.


CC BY-SA 4.0
2023-09-21T07:36:38.813
96298
2023-10-03T01:22:13.240
2023-09-21T11:38:33.103
3060
59860
question
r web-scraping
Rでのwebスクレイピングで、データが抽出できない


[rsDriver
{RSelenium}](https://search.r-project.org/CRAN/refmans/RSelenium/html/rsDriver.html)
を参照して作った記述例を下記に示します。

  * ブラウザは Chrome が第一選択ですが最新版が非対応エラーになったので Firefox を使いました。

  * 最初はトラブルが分かり易いように `verbose=TRUE` をお勧めします。特に初回はダウンロード等をして環境を構築しているようで少し時間がかかります。

  * 試した環境は「macOS(M1) 13.5.2, R 4.3.1, RSelenium 1.7.9, rvest 1.0.3」です。

なお，今回は初期画面の20件を取得できましたが，全197件を取得するならなんらかの工夫が必要です。もっと良い方法もありそうですが，検索条件（`url`
の末尾に `?q=23` 等で設定可）を変えて複数回に分けて取得する（最大表示件数は40件？）くらいしか思いつきませんでした。

[code]

    library(tidyverse)
    library(RSelenium)
    library(rvest)
    
    url <- "https://www.kyoiku.metro.tokyo.lg.jp/static/high_school/index.html"
    
    rD <- rsDriver(browser="firefox", verbose=FALSE)
    remDr <- rD[["client"]]
    remDr$navigate(url)
    src <- remDr$getPageSource()
    remDr$close()
    rD[["server"]]$stop()
    ## [1] TRUE
    
    hs_html <- read_html(src[[1]])
    ## xml2::write_html(hs_html, "high_school.html")
    
    school <- hs_html |>
        html_elements(".hitItemHead") |>
        html_elements("a") |>
        html_text()
    
    access <- hs_html |>
        html_elements(".hitItemBody") |>
        html_elements("table > tbody > tr:nth_child(4) > td") |>
        html_text2()
    
    tbl <- tibble(school, access)
    print(tbl, width=74)
    ## # A tibble: 20 × 2
    ##    school           access                                                
    ##    <chr>            <chr>                                                 
    ##  1 一橋高等学校     "浅草橋駅（総武線、都営浅草線）　徒歩7分\n秋葉原駅（… 
    ##  2 日比谷高等学校   "永田町駅（有楽町線、半蔵門線、南北線）　徒歩8分\n赤… 
    ##  3 晴海総合高等学校 "東京メトロ有楽町線月島駅徒歩8分\n都営地下鉄大江戸線… 
    ##  4 三田高等学校     "赤羽橋駅（都営大江戸線）　徒歩5分\n芝公園駅（都営三… 
    ##  5 芝商業高等学校   "浜松町駅（山手線、京浜東北線）　徒歩5分\nモノレール… 
    ##  6 六本木高等学校   "麻布十番駅（都営大江戸線）　徒歩8分\n麻布十番駅（南… 
    ##  7 新宿高等学校     "新宿駅（山手線、総武線、中央線、埼京線、湘南新宿ライ…
    ##  8 新宿山吹高等学校 "江戸川橋駅（有楽町線）　徒歩10分\n早稲田駅（東西線）…
    ##  9 戸山高等学校     "西早稲田駅（副都心線）　徒歩1分\n高田馬場駅（山手線… 
    ## 10 総合芸術高等学校 "曙橋駅（都営新宿線）　徒歩9分\n新宿御苑前駅（丸の内… 
    ## 11 竹早高等学校     "茗荷谷駅（丸ノ内線）　徒歩10分\n茗荷谷駅（丸ノ内線）…
    ## 12 向丘高等学校     "白山駅（都営三田線）　徒歩7分\n本駒込駅（南北線）　… 
    ## 13 工芸高等学校     "水道橋駅（総武線）　徒歩2分\n水道橋駅（都営三田線）… 
    ## 14 浅草高等学校     "浅草駅（東武スカイツリーライン、銀座線、都営浅草線）…
    ## 15 上野高等学校     "根津駅（千代田線）　徒歩6分\n上野駅（山手線・京浜東… 
    ## 16 忍岡高等学校     "浅草橋駅（JR総武線、都営浅草線）　徒歩5分\n新御徒町… 
    ## 17 白鷗高等学校     "新御徒町駅（都営大江戸線、つくばエクスプレス）　徒歩…
    ## 18 蔵前工科高等学校 "浅草橋駅（総武線，都営浅草線）　徒歩10分\n蔵前駅（都…
    ## 19 墨田川高等学校   "東向島駅（東武スカイツリーライン）　徒歩6分\n曳舟駅… 
    ## 20 日本橋高等学校   "曳舟駅（東武伊勢崎線、東武亀戸線）　徒歩10分\n京成曳…
    
[/code]

（御参考）  
ページ下端の「さらに表示」を必要回数クリックしてからソースを取得することで，全197件を取得できるようです。

[code]

    ## ...
    
    remDr$navigate(url)
    
    for (i in 1:9) {
        Sys.sleep(1)
        moreDisp <- remDr$findElement(using="link text", "さらに表示")
        moreDisp$clickElement()
    }
    
    src <- remDr$getPageSource()
    
    ## ...
    
    print(tbl, width=74)
    ## # A tibble: 197 × 2
    ##   school           access                                                 
    ##   <chr>            <chr>                                                  
    ## 1 一橋高等学校     "浅草橋駅（総武線、都営浅草線）　徒歩7分\n秋葉原駅（総…
    ## 2 日比谷高等学校   "永田町駅（有楽町線、半蔵門線、南北線）　徒歩8分\n赤坂…
    ## 3 晴海総合高等学校 "東京メトロ有楽町線月島駅徒歩8分\n都営地下鉄大江戸線月…
    ## 4 三田高等学校     "赤羽橋駅（都営大江戸線）　徒歩5分\n芝公園駅（都営三田…
    ## 5 芝商業高等学校   "浜松町駅（山手線、京浜東北線）　徒歩5分\nモノレール浜…
    ## 6 六本木高等学校   "麻布十番駅（都営大江戸線）　徒歩8分\n麻布十番駅（南北…
    ## # ℹ 191 more rows
    
[/code]


CC BY-SA 4.0
2023-09-24T01:48:31.147
96327
2023-10-03T01:22:13.240
2023-10-03T01:22:13.240
54588
54588
96298
answer


コメントにも書きましたが、ブラウザのデベロッパーツールで HTTP 通信の内容を確認してみると対象テーブルの中身(データ)は XMLHttpRequest
によって取得されてレンダリングされています。具体的な URLは
`https://www.kyoiku.metro.tokyo.lg.jp/static/high_school/js/data.csv` で、これを
`read.csv()` でデータフレームに変換するとよいかと思います。(全197件のデータを一度で取得できます)

[code]

    > df <- read.csv("https://www.kyoiku.metro.tokyo.lg.jp/static/high_school/js/data.csv")
    
    > nrow(df)
    [1] 197
    > head(colnames(df), 10)
     [1] "ファイル名"         "学校名"             "読み方"            
     [4] "住所"               "各校キャッチコピー" "アピールポイント"  
     [7] "スクールミッション" "使用路線"           "自転車通学可"      
    [10] "バイク通学可"      
    
    > head(df[c("学校名", "使用路線")])
               学校名
    1     一橋高等学校
    2   日比谷高等学校
    3 晴海総合高等学校
    4     三田高等学校
    5   芝商業高等学校
    6   六本木高等学校
    
    使用路線
    1 浅草橋駅（総武線、都営浅草線）　徒歩7分\n秋葉原駅（総武線、山手線、京浜東北線、日比谷線、つくばエクスプレス）　徒歩13分\n馬喰町駅（総武線）　徒歩3分\n馬喰横山駅（都営新宿線）　徒歩4分
    2 永田町駅（有楽町線、半蔵門線、南北線）　徒歩8分\n赤坂見附駅（銀座線、丸ノ内線）　徒歩8分\n溜池山王駅（銀座線、南北線）　徒歩7分\n国会議事堂前駅（丸ノ内線、千代田線）　徒歩7分
    3 東京メトロ有楽町線月島駅徒歩8分\n都営地下鉄大江戸線月島駅徒歩8分\n都営バス門33系統　亀戸駅前発　豊海水産埠頭行　月島三丁目下車　徒歩6分\n都営バス東15系統　深川車庫前発　東京駅八重洲口行　晴海一丁目下車　徒歩1分\n都営バス業10系統　新橋発　東京スカイツリー駅前行　晴海一丁目下車　徒歩0分
    4 赤羽橋駅（都営大江戸線）　徒歩5分\n芝公園駅（都営三田線）　徒歩7分\n麻布十番駅（南北線）　徒歩10分\n三田駅（都営浅草線）　徒歩12分\n田町駅（山手線、京浜東北線）　徒歩13分
    5 浜松町駅（山手線、京浜東北線）　徒歩5分\nモノレール浜松町駅（東京モノレール）　徒歩5分\n大門駅（都営浅草線、都営大江戸線）　徒歩5分\n竹芝駅（ゆりかもめ）　徒歩5分
    6 麻布十番駅（都営大江戸線）　徒歩8分\n麻布十番駅（南北線）　徒歩9分\n六本木駅（日比谷線）　徒歩7分
    
[/code]


CC BY-SA 4.0
2023-09-24T04:23:04.323
96331
2023-09-24T04:23:04.323
47127
96298
answer