【发布时间】:2018-04-23 04:00:23
【问题描述】:
我在尝试从 Freeride World Tour 网站获取排名时遇到问题。
我首先尝试在 Chrome 中使用 selectorGadget 获取 rvest 的 CSS 代码,但只能获取车手及其总分。我感兴趣的是获得骑手在每次预赛中得分。我是网络抓取和 CSS/HTML 的新手,所以请和我一起坚持下去。
# Get the website url
url <- read_html("https://www.freerideworldtour.com/rankings-detailed?season=165&competition=2&discipline=38")
从页面下载所有内容,
(all_text <- url %>%
html_nodes("div") %>%
html_text())
然后寻找 Kristofer Turdell 的第一个 2500 分得分。 grep("2500 pts.", all_text) 但我发现……什么都没有?
当我右键单击 2500 点时。在网站上选择“Inspect”可以看到该部分的html代码是:
<div class="field__item even">2500 pts.</div>
所以我尝试使用div class:
url %>%
html_nodes(".field__item.even:) %>%
html_text()
这仅返回参与者的总分(例如 Kristofer Turdell 7870 分)。
接下来,我尝试使用右键单击选项从“Inspect”中保存 Xpath。
url %>%
html_nodes(xpath = "//*[@id="page-content"]/div/div/div[2]/div/div/div/div[1]/div[2]/div/div/div[1]/div/div[4]/div/div/div") %>%
html_text()
我在这方面没有任何运气,所以非常感谢您的帮助。
【问题讨论】:
-
当您单击展开每个数据时,似乎正在使用 JavaScript 加载数据。即使它被隐藏,它也可能仍然可用,但否则您需要使用可以以编程方式为您单击按钮的东西,例如 splashr 或 RSelenium。
-
获取单个玩家的网址并从那里抓取可能更容易。例如
url <- read_html("https://www.freerideworldtour.com/rider/kristofer-turdell"),然后是url %>% html_node("div") %>% html_text() %>% gsub("\\s*\\n+\\s*",";",.) %>% gsub("pts.", "\n", .) %>% read.table(text = ., fill = T, sep = ";", row.names = NULL, col.names = c("Drop", "Ranking", "FWT", "Events", "Points")) %>% subset(select=2:5) %>% dplyr::filter(!is.na(as.numeric(as.character(Ranking)))),遵循@Onyambu 的风格。 -
谢谢@Kim。如果我为 Rider
riders <- c("kristofer-turdell", "markus-eder", "mickael-bimboes")创建一个向量,并为 urlurl_base <- "https://www.freerideworldtour.com/rider/"创建一个前缀,我应该可以使用bind_rows()创建一个 for 循环,但是我只能打印到控制台for (i in riders) { read_html(paste0(url_base, i)) %>% html_node("div") %>% ... mutate(name = i) %>% print() }。...代表我省略的代码部分。
标签: html css r web-scraping rvest