Продолжить поиск в цикле, когда Rselenium возвращает ошибку «NoSuchElement» - PullRequest
0 голосов
/ 10 марта 2019

Я использую Rselenium для сбора информации об аренде в рекламе с сайта. Однако, похоже, что не каждое объявление содержит информацию об аренде. Поэтому, когда мой цикл выполняется для тех, у кого нет информации об аренде, он сталкивается с ошибкой, то есть «NoSuchElement», и цикл останавливается. Я хочу:

1 / заполните значения «NA» для тех случаев, когда информация об аренде отсутствует; и

2 / продолжить цикл для удаления информации об аренде.

Я уже пробовал использовать функцию «tryCatch», однако, похоже, она не работает. R по-прежнему выдает ошибку, т.е. «Ошибка: Сводка: NoSuchElement Подробно: элемент не может быть расположен на странице с использованием заданных параметров поиска. Дополнительная информация: запустить метод errorDetails ".

Мой код указан ниже. Я ценю ваше время и помощь.

#add url
url <- "https://www.toimitilat.fi/toimitilahaku/?size_min=&size_max=&deal_type%5B%5D=1&language=fin&result_type=list&advanced=0&gbl=1&ref=main#searchresult"  
rD <- rsDriver()
remDr <- rD$client

remDr$navigate(url)

 <  for(i in 8:13){ 
  Sys.sleep(0.86)
  rent <- remDr$findElement(using = "css selector", paste("#objectList > div:nth-child(", i, ") > div.infoCont > div.priceCont", sep = ""))$getElementText()
  #checking if there is a rent or not
  if(!is.null(rent)){
    tryCatch({
      rent <- unlist(strsplit(rent[[1]][1], "\n"))
      rent_df <- rbind(rent_df, rent)
  }, error = function(e){
    return("NoSuchElement")
    i = i + 1
    })
  }
}
>

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Вы можете сделать это гораздо проще с rvest, чем с помощью кувалды RSelenium.Он также намного лучше справляется с отсутствующей информацией.

Чтобы получить информационный кадр с адресами и арендной платой, вы можете использовать html_nodes, чтобы создать список блоков, содержащих информацию, а затем html_node, чтобы найтисоответствующая информация в каждом.Для каждого поля будет одна запись, а все пропущенные данные будут отображаться как NA.

library(dplyr) #only needed for the pipe operator %>%
library(rvest)

url <- "https://www.toimitilat.fi/toimitilahaku/?size_min=&size_max=&deal_type%5B%5D=1&language=fin&result_type=list&advanced=0&gbl=1&ref=main#searchresult"  

boxes <- read_html(url) %>%                      #read the page
      html_nodes(".infoCont")                    #find the info boxes

address <- boxes %>% 
      html_node("h4 > a") %>%                    #find the address info in each box
      html_text()

rent <- boxes %>% 
      html_node(".priceCont") %>%                #find the rent info in each box
      html_text() %>%                            #extract the text
      trimws()                                   #trim whitespace

#put together in a dataframe
rent_df <- data.frame(address = address,   
                      rent = rent,
                      stringsAsFactors = FALSE)

head(rent_df)
                       address                                             rent
1           Akaa, Airolantie 5 Myyntihinta: \nMyydään tarjousten perusteella...
2           Akaa, Hämeentie 18                                             <NA>
3     Akaa, Hämeentie 69, Akaa           
4          Akaa, Keskuskatu 42                    Vuokrahinta: \n300 e/kk + alv
5 Akaa, Kirkkotori 10, Toijala                               Vuokrahinta: \n450
6  Akaa, Palomäentie 6 Toijala                         Vuokrahinta: \n3€/m2+alv 

. После этого вы сможете легко извлечь необходимую информацию.

0 голосов
/ 10 марта 2019

Решение с rvest должно быть проще, но если вы хотите или должны использовать RSelenium, это должно работать:

# Preparation
library(dplyr)                                     # required for bind_rows 

# add url
url <- "https://www.toimitilat.fi/toimitilahaku/?size_min=&size_max=&deal_type%5B%5D=1&language=fin&result_type=list&advanced=0&gbl=1&ref=main#searchresult"  
rD <- rsDriver()
remDr <- rD$client
remDr$navigate(url)

# Checking that rD and remDr objects exist and work
## If youg get an error here, that means that selenium objects doesn´t work - usually because ports are busy, selenium server or client have not been closed properly or browser drivers are out of date (or something else)
class(rD)
class(remDr)

# making separate function retrieving the rent and handling exceptions
giveRent <- function(i) {
  Sys.sleep(0.86)
  tryCatch( {
    rent <- remDr$findElement(using = "css selector", paste("#objectList > div:nth-child(", i, ") > div.infoCont > div.priceCont", sep = ""))$getElementText()
    rent <- unlist(strsplit(rent[[1]][1], "\n"))
    rent <- rent[2]}
    , warning = function(e){rent <<- NA}
    , error = function(e){rent <<- NA})
  return(rent)}

# adding rent to the dataframe in for-loop
rent_df <- c()
for(i in 1:33){rent_df <- bind_rows(rent_df, (data.frame(giveRent(i))))}
print(rent_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...