Как сообщить о NA при очистке сети с помощью R, если она не имеет ценности?

Я соскребаю информацию со страницы на booking.com и создаю фрейм данных. Я заметил, что не у всех отелей есть рейтинги.

Я пробовал это, например:

# Got the elements from Inspect code of the page
titles_page <- page %>% html_elements("div[data-testid='title'][class='fcab3ed991 a23c043802']") %>% html_text()
prices_page <- page %>% html_elements("span[data-testid='price-and-discounted-price']") %>% html_text()
ratings_page <- page %>% html_elements("div[aria-label^='Punteggio di']") %>% html_text()

# The variable ratings
tryCatch(expr  = {
      ratings_page <- remDr$findElements(using = "xpath", value = "div[aria-label^='Punteggio di']")$getElementAttribute('value')
    },   
    #If the information does not exist in this way it writes NA to the ratings element
    error = function(e){          
      ratings_page <-NA
    })

И это ничего не меняет.

Как сообщить о NA, если объект не имеет ценности?

Ссылка

Пробовал решение, но ничего не происходит. посмотри: #parse out the parent node for each parent titles_page <- page %>% html_elements("div[data-testid='title']") %>% html_children() #parse out the requested information from each child. prices_page <- titles_page %>% html_elements("span[data-testid='price-and-discounted-price'‌​]") %>% html_text() ratings_page <- titles_page %>% html_elements("div[aria-label^='Punteggio di']") %>% html_text()

Anisa 18.04.2023 20:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Может быть, что-то вроде следующего. Непроверенный.

# The variable ratings
ratings_page <- tryCatch(
  expr = {
    elem <- remDr$findElements(using = "xpath", value = "div[aria-label^='Punteggio di']")
    elem$getElementAttribute('value')
  },   
  # If the information does not exist in this way it writes NA to the ratings element
  error = function(e) NA
)

Это был превосходный ответ, но когда я запустил код, я получил фрейм данных со всеми значениями NA. Я думаю, он пропускает только что-то маленькое

Anisa 18.04.2023 20:18

@Anisa У нас нет URL-адреса для проверки кода. Кроме того, вы используете RSelenium, а не rvest.

Rui Barradas 18.04.2023 21:09

Нет, я использую Rvest, я не загрузил Rselenium

Anisa 19.04.2023 11:06

@Anisa Но remDr$findElements и elem$getElementAttribute - это код RSelenium. Возможно, ошибка исходит оттуда, попробуйте запустить первую из этих инструкций, чтобы увидеть, что у вас получится. Вероятно, ошибка «не удалось найти функцию». Если я прав, то expr часть tryCatch всегда будет выдавать ошибку, а часть error всегда будет выполняться, всегда возвращая NA.

Rui Barradas 19.04.2023 11:09

@Anisa Кроме того, не могли бы вы опубликовать точный URL-адрес в вопросе, пожалуйста, чтобы мы могли протестировать код?

Rui Barradas 19.04.2023 11:12

Конечно, но это слишком долго для комментариев. Как я могу отправить его иначе?

Anisa 19.04.2023 12:08

@Anisa Вы можете отредактировать вопрос и опубликовать там длинный URL. Вы должны указать причину редактирования. Затем сохраните редактирование.

Rui Barradas 19.04.2023 12:56

Я сделал это, проверьте это

Anisa 19.04.2023 19:05
Ответ принят как подходящий

Вот решение, основанное на стратегии из этой ссылки: Как собрать элементы вместе, чтобы не потерять индекс?.

Ключевым здесь является использование html_element() (без s). html_element() всегда будет возвращать ответ, даже если это NA. Таким образом, если элемент отсутствует в родительском узле, NA заполнит пробелы.

library(rvest)
library(dplyr)

#read the page
url <-"https://www.booking.com/searchresults.it.html?ss=Firenze%2C+Toscana%2C+Italia&efdco=1&label=booking-name-L*Xf2U1sq4*GEkIwcLOALQS267777916051%3Apl%3Ata%3Ap1%3Ap22%2C563%2C000%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp9069992%3Ali%3Adec%3Adm%3Appccp&aid=376363&lang=it&sb=1&src_elem=sb&src=index&dest_id=-117543&dest_type=city&ac_position=0&ac_click_type=b&ac_langcode=it&ac_suggestion_list_length=5&search_selected=true&search_pageview_id=2e375b14ad810329&ac_meta=GhAyZTM3NWIxNGFkODEwMzI5IAAoATICaXQ6BGZpcmVAAEoAUAA%3D&checkin=2023-06-11&checkout=2023-06-18&group_adults=2&no_rooms=1&group_children=0&sb_travel_purpose=leisure&fbclid=IwAR1BGskP8uicO9nlm5aW7U1A9eABbSwhMNNeQ0gQ-PNoRkHP859L7u0fIsE"
page <- read_html(url)

#parse out the parent node for each parent 
properties <- html_elements(page, xpath = ".//div[@data-testid='property-card']")

#now find the information from each parent
#notice html_element - no "s"
title <- properties %>% html_element("div[data-testid='title']") %>% html_text()
prices <- properties %>% html_element("span[data-testid='price-and-discounted-price']") %>% html_text()    
ratings <- properties %>% html_element(xpath = ".//div[@aria-label]") %>% html_text()

data.frame(title, prices, ratings)

                                       title   prices ratings
1                   Sweetly home in Florence US$1.918    <NA>
2                                   Pepi Red US$3.062        
3                 hu Firenze Camping in Town   US$902     8,4
4                              Plus Florence US$1.754     7,9
5                     Artemente Florence B&B US$4.276        
6                                Villa Aruch US$1.658        
7                                Hotel Berna US$2.184        
8                                Hotel Gioia US$2.437        
9                              Hotel Magenta US$3.250        
10                              Villa Neroli US$3.242        
11                       Residenza Florentia US$2.792     8,0
12                Ridolfi Sei Suite Florence US$1.243    <NA>
...

Сразу протестирую.

Anisa 19.04.2023 11:07

Я получаю эту ошибку в as.data.frame.default(x[[i]], необязательный = TRUE, stringsAsFactors = stringsAsFactors): невозможно принудить класс «xml_nodeset» к data.frame

Anisa 19.04.2023 22:52

Приведенный выше код работает в моей системе с образцом URL. Дважды проверьте (с функцией str()), чтобы убедиться, что заголовок, цены, рейтинги и т. д. были преобразованы из узла в строку символов с помощью функции html_text().

Dave2e 20.04.2023 00:35

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