#r #dplyr #tidyverse #rvest #xml2
Вопрос:
Я попытался извлечь несколько html_table с помощью пакета rvest в R, используя сценарии:
library(rvest)
library(dplyr)
library('xml2')
library(tidyverse)
jump <- seq(1, 2, by = 1)
urls <- paste('https://asbdavani.org/horse/foals/', jump, sep="")
out <- vector("character", length = length(urls))
for(i in seq_along(urls)){
derby <- read_html(urls[i], encoding="UTF-8")
out[i] <- derby %>%
html_table(fill = TRUE)
}
first_table <- out[[1]]
Здесь я извлек одну из этих таблиц как first_table:
Я хочу знать, как у меня могут быть ссылки на каждый символ в столбцах 2, 6 и 7, как это :
Ответ №1:
Это сложная проблема, так как вам нужно выбрать определенные столбцы в таблице. Селектор xpath «n-й дочерний» предоставляет такую возможность.
Приведенный ниже код продемонстрирует решение всего на 1 таблице с 1 страницы, чтобы упростить объяснение. Это должно быть относительно легко скопировать и вставить в ваш код.
#Read the page
url<-"https://asbdavani.org/horse/foals/6404"
page <- read_html(url)
#extract the tables from the page
tables <-page %>% html_elements("table")
#In this case we are looking at the second table
#extract each row of the table
rows <-tables[2] %>% html_elements("tr")
#remove the first row since that is the heading
#get the 2nd column from each row
#and parse the "a" html tag from the 2nd column
#retrieve the href link
col2Links <- rows[-1] %>% html_element("td:nth-child(2) a") %>% html_attr("href")
#repeat for columns 6 amp; 7
col6Links <- rows[-1]%>% html_element("td:nth-child(6) a") %>% html_attr("href")
col7Links <- rows[-1]%>% html_element("td:nth-child(7) a") %>% html_attr("href")
#will need to paste0 "https://asbdavani.org" onto each link.
#col2Links %>% paste0("https://asbdavani.org", .)
#make data.frame
answer <-data.frame(col2Links, col6Links, col7Links)
answer
col2Links col6Links col7Links
1 /horse/performance/13993 /horse/performance/6404 <NA>
2 /horse/performance/13873 /horse/performance/6404 <NA>
3 /horse/performance/533 /horse/performance/6404 /horse/performance/10958
4 /horse/performance/5277 /horse/performance/6404 /horse/performance/11051
5 /horse/performance/5461 /horse/performance/6404 /horse/performance/11049
6 /horse/performance/5602 /horse/performance/6404 /horse/performance/11084
7 /horse/performance/6466 /horse/performance/6404 /horse/performance/11097
8 /horse/performance/11004 /horse/performance/6404 /horse/performance/10994
9 /horse/performance/11113 /horse/performance/6404 /horse/performance/11097
10 /horse/performance/11114 /horse/performance/6404 /horse/performance/11097
11 /horse/performance/11126 /horse/performance/6404 /horse/performance/11119
Ответ №2:
Это довольно неаккуратная реализация, но в принципе работает. Вы, конечно, можете сделать его более кратким, и я не перемещал и не переименовывал столбцы в соответствии с вашим точным примером.
library(rvest)
library(dplyr)
library('xml2')
library(tidyverse)
jump <- seq(1, 2, by = 1)
urls <- paste('https://asbdavani.org/horse/foals/', jump, sep="")
out <- data.frame()
for(i in seq_along(urls)) {
html <- read_html(urls[i], encoding = "UTF-8")
derby <-
html %>% html_elements("td") %>%
html_children() %>%
html_attr('href')
links <-
matrix(derby,
nrow = length(derby) / 3,
ncol = 3,
byrow = T) %>% as.data.frame()
combined <- html %>%
html_table(fill = TRUE) %>% bind_cols(., tibble(
اسب = links$V1,
سیلمی = links$V2,
مادیان = links$V3
))
out <- bind_rows(out, combined)
}
Комментарии:
1. Спасибо! но ваш код не работает для таблиц, в которых есть некоторые пустые элементы (например » asbdavani.org/horse/foals/6404 » или » asbdavani.org/horse/foals/11084″ ).