Извлечение ссылок вместо символов в каждой ячейке таблицы html_table с помощью R

#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″ ).