Я соскребаю информацию со страницы на 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, если объект не имеет ценности?
Может быть, что-то вроде следующего. Непроверенный.
# 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 У нас нет URL-адреса для проверки кода. Кроме того, вы используете RSelenium, а не rvest.
Нет, я использую Rvest, я не загрузил Rselenium
@Anisa Но remDr$findElements
и elem$getElementAttribute
- это код RSelenium. Возможно, ошибка исходит оттуда, попробуйте запустить первую из этих инструкций, чтобы увидеть, что у вас получится. Вероятно, ошибка «не удалось найти функцию». Если я прав, то expr
часть tryCatch
всегда будет выдавать ошибку, а часть error
всегда будет выполняться, всегда возвращая NA
.
@Anisa Кроме того, не могли бы вы опубликовать точный URL-адрес в вопросе, пожалуйста, чтобы мы могли протестировать код?
Конечно, но это слишком долго для комментариев. Как я могу отправить его иначе?
@Anisa Вы можете отредактировать вопрос и опубликовать там длинный URL. Вы должны указать причину редактирования. Затем сохраните редактирование.
Я сделал это, проверьте это
Вот решение, основанное на стратегии из этой ссылки: Как собрать элементы вместе, чтобы не потерять индекс?.
Ключевым здесь является использование 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>
...
Сразу протестирую.
Я получаю эту ошибку в as.data.frame.default(x[[i]], необязательный = TRUE, stringsAsFactors = stringsAsFactors): невозможно принудить класс «xml_nodeset» к data.frame
Приведенный выше код работает в моей системе с образцом URL. Дважды проверьте (с функцией str()
), чтобы убедиться, что заголовок, цены, рейтинги и т. д. были преобразованы из узла в строку символов с помощью функции html_text()
.
Пробовал решение, но ничего не происходит. посмотри:
#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()