我在试图从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点时。在网站上选择“检查”我可以看到此部分的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()
我没有运气,所以我非常感谢你的帮助。
答案 0 :(得分:1)
url %>%
html_node("div.panel-second")%>%
html_text() %>%
gsub("\\s*\\n+\\s*",";",.)%>%
gsub("pts.","\n",.)%>%
read.table(text=.,fill=T,sep=";",row.names = NULL)%>%
subset(select=3:4)%>%na.omit()
V3 V4
1 Kristofer Turdell 7870
2 Markus Eder 7320
3 Mickael Bimboes 6930
4 Loic Collomb-Patton 6660
5 Yann Rausis 6290
6 Berkeley Patterson 5860
7 Leo Slemett 5835
8 Ivan Malakhov 5800
9 Craig Murray 5705
10 Logan Pehota 5655
11 Reine Barkered 5470
12 Grifen Moller 4765
13 Sam Lee 4580
14 Ryan Faye 3210
15 Conor Pelton 3185
16 George Rodney 3115
17 Taisuke Kusunoki 3060
18 Trace Cooke 2905
19 Aymar Navarro 2855
20 Felix Wiemers 2655
21 Fabio Studer 2305
22 Stefan Hausl 2240
23 Drew Tabke 1880
24 Carl Regnér Eriksson 1310
答案 1 :(得分:0)
在评论中写了那么多代码是非常糟糕的,所以这里。您可以将已删除的数据存储到数据框中,而不仅限于将其打印到控制台:
library(tidyverse)
library(magrittr)
library(rvest)
url_base <- "https://www.freerideworldtour.com/rider/"
riders <- c("kristofer-turdell", "markus-eder", "mickael-bimboes")
output <- data_frame()
for (i in riders) {
temp <- read_html(paste0(url_base, i)) %>%
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))) &
as.character(Points) != ""
) %>%
dplyr::mutate(name = i)
output <- bind_rows(output, temp)
}
我放置了诸如as.character(Points) != ""
之类的部分以排除积分总和(例如在Mickael Bimboe的6930分中),而不是个人得分。
尽管如此,@ Onyambu还是有很多功劳,从他的回答中借用了很多行。