Построчно применить rvest html_nodes() и сохранить вывод в новом столбце

У меня есть несколько URL-адресов, которые я хотел бы очистить. Я получаю 3 кадра данных (например):

# A tibble: 255 × 7
   id                   class                                                                                                                            tabindex role  `aria-controls` style `data-testid`
   <chr>                <chr>                                                                                                                            <chr>    <chr> <chr>           <chr> <chr>        
 1 App                  NA                                                                                                                               NA       NA    NA              NA    NA           
 2 NA                   re-AdTop1Container                                                                                                               NA       NA    NA              NA    NA           
 3 NA                   re-AdTop1Container-block                                                                                                         NA       NA    NA              NA    NA           
 4 NA                   re-AdvertisingDominanceCrossdevice-x65                                                                                           NA       NA    NA              NA    NA           
 5 PubX65Detail_wrapper adit-XandrBanner adit-XandrBanner--notAvailable                                                                                  NA       NA    NA              NA    NA           
 6 PubX65Detail         NA                                                                                                                               NA       NA    NA              NA    NA           
 7 NA                   re-AdvertisingDominanceCrossdevice-top1                                                                                          NA       NA    NA              NA    NA           
 8 PubTop1_wrapper      adit-XandrBanner adit-XandrBanner--notAvailable                                                                                  NA       NA    NA              NA    NA           
 9 PubTop1              NA                                                                                                                               NA       NA    NA              NA    NA           
10 NA                   react-MoleculeDrawer-content react-MoleculeDrawer-content--placement-left react-MoleculeDrawer-content--size-auto react-Molecul… NA       NA    NA              NA    NA

Я хочу просмотреть каждую строку в столбце class и сохранить собранные данные в новом столбце.

то есть я могу вручную собирать данные, используя:

html3 %>% 
  html_nodes('.re-DetailHeader-propertyTitleContainer')

но я хотел бы сохранить «структуру» собранных rvest данных. Я хочу создать новую колонку и сохранить все сохраненные html_nodes(), используя классы в колонке class.

Код:

url1 = "https://www.fotocasa.es/es/comprar/vivienda/madrid-capital/terraza-piscina/163103410/d"
url2 = "https://www.fotocasa.es/es/comprar/vivienda/elche---elx/calefaccion-terraza-ascensor-parking-internet-no-amueblado/162434119/d"
url3 = "https://www.fotocasa.es/es/comprar/vivienda/almoradi/terraza-trastero-ascensor-amueblado/163000099/d"



##### process url 1 #####
html1 = url1 %>% 
  read_html()


classAttrs_1 = html1 %>% 
  html_nodes('div') %>% 
  html_attrs() %>% 
  bind_rows() %>% 
  mutate_all(na_if,"")

########################

##### process url 2 #####
html2 = url2 %>% 
  read_html()


classAttrs_2 = html2 %>% 
  html_nodes('div') %>% 
  html_attrs() %>% 
  bind_rows() %>% 
  mutate_all(na_if,"")

########################

##### process url 3 #####
html3 = url3 %>% 
  read_html()


classAttrs_3 = html3 %>% 
  html_nodes('div') %>% 
  html_attrs() %>% 
  bind_rows() %>% 
  mutate_all(na_if,"")

########################

Длина каждого из собранных URL-адресов может меняться, т.е.

> length(unique(classAttrs_1$class))
[1] 113
> length(unique(classAttrs_2$class))
[1] 114
> length(unique(classAttrs_3$class))
[1] 115

Поэтому я подумал об индивидуальной обработке каждого фрейма данных.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем использовать rowwise, проверить, не является ли значение в «классе» не NA, применить код и создать столбец list (иначе вернуть NA)

library(rvest)
library(dplyr)
library(stringr)
classAttrs_3_new <- classAttrs_3 %>%  
   rowwise %>%
   mutate(new = list(if(is.na(class)) NA else html3 %>%
   html_nodes(str_c(".", class)))) %>% 
   ungroup

-выход

> head(classAttrs_3_new$new)
[[1]]
[1] NA

[[2]]
{xml_nodeset (1)}
[1] <div class="re-AdTop1Container"><div class="re-AdTop1Container-block">\n<div class="re-AdvertisingDominanceCrossdevice-x65"><div id="PubX65Detail_wrapper" class="adit-XandrB ...

[[3]]
{xml_nodeset (1)}
[1] <div class="re-AdTop1Container-block">\n<div class="re-AdvertisingDominanceCrossdevice-x65"><div id="PubX65Detail_wrapper" class="adit-XandrBanner adit-XandrBanner--notAvail ...

[[4]]
{xml_nodeset (1)}
[1] <div class="re-AdvertisingDominanceCrossdevice-x65"><div id="PubX65Detail_wrapper" class="adit-XandrBanner adit-XandrBanner--notAvailable"><div id="PubX65Detail"></div></div ...

[[5]]
{xml_nodeset (0)}

[[6]]
[1] NA

Или другой вариант map

library(purrr)
pfun_node <- possibly(function(html_obj, node_val ) 
      html_obj %>% html_nodes(node_val), otherwise = NA)
classAttrs_3$new <- map(str_c(".", classAttrs_3$class), ~ pfun_node(html3, .x))

Другие вопросы по теме