我正在嘗試從https://www.futhead.com/22/players/?page=1&level=gold_nif&bin_platform=ps抓取資料來制作一個包含所有球員姓名和他們的統計資料(總體評分、位置、pac、sho , pas, dri, def, phy),但是我的 rvest 無法將資訊檢測為表格。
我試過:
for(i in 1:10) {
page <- read_html(paste("https://www.futhead.com/22/players/?page=1&level=gold_nif&bin_platform=ps",sep=""))
}
StatsTable <- page %>%
html_table(fill=TRUE)
head(StatsTable)
這導致列印出一個 list() 而不是一個表。如何編輯我的 for 回圈,讓 read_html 和 html_table 檢測到網站上的資料,以便我可以創建一個包含玩家統計資料的資料框?
我也試過第一頁是這樣的:
first <- read_html("https://www.futhead.com/22/players/?page=1&level=gold_nif&bin_platform=ps",sep="")
first
tab <- first %>%
html_nodes(".padding-0") %>%
html_text()
tab
### Deletes spaces and \n
tab <- gsub(" ", "", tab)
tab <- gsub("\n", " ", tab)
tab
通過這種方式,我從第一頁獲取了所有資料,但是所有資訊都放入了字符中。也許是否可以從這些字符中提取名稱和統計資訊以使其成為資料幀?那怎么可能呢?
uj5u.com熱心網友回復:
好的,要獲取所有 10 個網頁,您可以使用以下代碼:
library(stringr)
url <- "https://www.futhead.com/22/players/?page=1&level=gold_nif&bin_platform=ps"
p1 <- str_c("https://www.futhead.com/22/players/",'?page=', 1:10)
pages <- paste0(p1,"&level=gold_nif&bin_platform=ps")
但是,這并不能解決您的所有問題。
uj5u.com熱心網友回復:
我認為您無法使用 html_table 完成您想要的作業。您頁面上的表格是一個 htmltable元素,而是一個ul.
你會注意到看起來像一張桌子的東西實際上是一個<ul >. 然后,您需要使用不同的 html_node() 命令來獲取您想要的資訊。IE
page %>%
html_nodes("[class='list-group list-group-table player-group-table']") %>%
html_nodes("[class='player-info']") %>% html_nodes("[class='player-image']") %>%
html_attr("alt") -> player_names
和
page %>%
html_nodes("[class='player-right text-center hidden-xs']") %>%
html_nodes("[class='value']") %>%
html_text() %>%
matrix(nrow=length(player_names), ncol=6, byrow=T) -> player_stats
最后,將所有內容都放入一個 data.frame 中:
# make player_names into a tibble and extract overall score
library(tidyverse)
player_names %>% as_tibble() -> player_names
names(player_names) <- 'player'
substr(player_names$player, str_length(player_names$player)-1, str_length(player_names$player)) -> overall
player_names$overall <- overall
# stat names for player_stats
as_tibble(player_stats) -> player_stats
names(player_stats) <- c('pac','sho','pas','dri','def','phy')
#bind everything together
bind_cols(player_names, player_stats) -> players
rm(player_names); rm(player_stats)
結果:
> players
# A tibble: 48 x 8
player overall pac sho pas dri def phy
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Lionel Messi 93 93 85 92 91 95 34 65
2 Robert Lewandowski 92 92 78 92 79 86 44 82
3 C. Ronaldo dos Santos Aveiro 91 91 87 93 82 88 34 75
4 Kevin De Bruyne 91 91 76 86 93 88 64 78
5 Neymar da Silva Santos Jr. 91 91 91 83 86 94 37 63
6 Kylian Mbappé 91 91 97 88 80 92 36 77
7 Harry Kane 90 90 70 91 83 83 47 83
8 N'Golo Kanté 90 90 78 66 75 82 87 83
9 Mohamed Salah 89 89 90 87 81 90 45 75
10 Karim Benzema 89 89 76 86 81 87 39 77
# … with 38 more rows
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336875.html
下一篇:計算兩個資料場之間的百分比
