麻烦在嵌套表上使用rvest

时间:2018-04-23 04:00:24

标签: html css r web-scraping rvest

我在试图从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()

我没有运气,所以我非常感谢你的帮助。

2 个答案:

答案 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还是有很多功劳,从他的回答中借用了很多行。