R: Rvest - есть скрытый текст, который я не хочу

Я делаю веб-скрейпинг в этой сети:

http://www.falabella.com.pe/falabella-pe/category/cat40536/Climatizacion?navAction=push

Мне просто нужна информация от продуктов: "бренд", "название продукта", "цена".

введите здесь описание изображения

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

Но когда я перехожу к исходному коду страницы, я не вижу эти продукты. Я думаю, что это было сделано через javascript или что-то в этом роде:

введите здесь описание изображения

ВОПРОС 1: Как заблокировать эту информацию при просмотре веб-страниц? Это добавляет продукты, которые мне не нужны. Но не могу увидеть эту часть в исходном коде.

ВОПРОС 2. При извлечении цен "precio1" я получаю это как первый элемент: "\n\t\t\t\tSubtotal InternetS/. 0" Я также не вижу этого в исходном коде. Как его не поцарапать?

library(RSelenium)
library(rvest)
#start RSelenium
checkForServer()
startServer()
remDr <- remoteDriver()
remDr$open()

#navigate to your page
remDr$navigate("http://www.falabella.com.pe/falabella-pe/category/cat40536/Climatizacion?navAction=push")


page_source<-remDr$getPageSource()


Climatizacion_marcas1 <- html(page_source[[1]])%>%
        html_nodes(".marca") %>%
        html_nodes("a") %>%
        html_attr("title")


Climatizacion_producto1 <- html(page_source[[1]])%>%
        html_nodes(".detalle") %>%
        html_nodes("a") %>%
        html_attr("title")


Climatizacion_precio1 <- html(page_source[[1]])%>%
        html_nodes(".precio1") %>%
        html_text()

person Omar Gonzales    schedule 30.05.2015    source источник


Ответы (1)


Оставаясь рядом с вашим подходом, это сделает это:

library(rvest)
u <- "http://www.falabella.com.pe/falabella-pe/category/cat40536/Climatizacion?navAction=push"
doc <- html(u)

Climatizacion_marcas1 <- doc %>% 
  html_nodes(".marca")[[1]] %>%
  html_nodes("a") %>%
  html_attr("title")

Climatizacion_producto1 <- doc %>% 
  html_nodes(".detalle") %>%
  html_nodes("a") %>%
  html_attr("title")

"\n\t\t" и т. д. исходят из разбора html. Судя по всему, там есть возврат каретки и вкладки. Простое решение:

Climatizacion_precio1 <- doc %>% 
  html_node(".precio1") %>%
  html_text() %>% 
  stringr::str_extract_all("[:number:]{1,4}[.][:number:]{1,2}", simplify = TRUE) %>% 
  as.numeric

Climatizacion_precio1
[1] 44.9

Это фактически выбирает число из строки (таким образом, также удаляя «S/.». Если вы хотите, чтобы «S/.» остался, вы можете сделать следующее:

Climatizacion_precio1 <- doc %>% 
  html_node(".precio1") %>%
  html_text() %>% 
  gsub('[\r\n\t]', '', .)

Climatizacion_precio1
[1] "S/. 44.90"

EDIT Вот альтернативный подход, использующий XML и selectr. Это позволит получить информацию обо всех элементах на странице за один раз.

library(XML)

clean_up <- function(x) {
  stringr::str_replace_all(x, "[\r\t\n]", "")
}

product <- selectr::querySelectorAll(doc, ".marca") %>% 
  xmlApply(xmlValue) %>% lapply(clean_up) %>% unlist

details <-   selectr::querySelectorAll(doc, ".detalle a") %>% 
  xmlApply(xmlValue) %>% 
  unlist

price <- selectr::querySelectorAll(doc, ".precio1") %>% 
  xmlApply(xmlValue) %>% lapply(clean_up) %>% unlist

as.data.frame(cbind(product, details, price))
      product                  details      price
1       Imaco  Termoventilador NF15...  S/. 44.90
2       Imaco  Ventilador de 10"  I...     S/. 69
3       Imaco  Ventilador Imaco de ...     S/. 89
4      Taurus  Recirculador TRA-30 ...     S/. 89
5       Imaco  Termoventilador ITC-...    S/. 109
6        Sole Termo Ventilador Elé...     S/. 99
7      Taurus  Ventilador TVP-40 3 ...     S/. 99
8       Imaco  Estufa OFR7AO 1.500 ...    S/. 129
9      Alfano  Ventilador Recircula...    S/. 139
10     Taurus  Ventilador TVC-40RC ...    S/. 139
11      Imaco  Ventilador Pedestal ...    S/. 149
12     Alfano  Ventilador Orbital 1...    S/. 149
13 Electrolux  Ventilador  de Mesa ... S/. 149.90
14     Alfano  Estufa Termoradiador...    S/. 159
15     Alfano  Ventilador Pared 18"...    S/. 169
16      Imaco     Termoradiador OFR9AO    S/. 179

Обычно вы, вероятно, захотите сделать некоторую первоначальную очистку результатов.

person Peter Verbeet    schedule 31.05.2015
comment
Спасибо. Это интересно, поэтому вы просто удаляете его, а затем удаляете с помощью регулярного выражения. Насчет баннера внизу, я мог бы еще убрать последние 4 элемента (в баннере 4 товара). Вы говорите, приближаясь к вашему подходу, есть ли лучший способ сделать это? - person Omar Gonzales; 31.05.2015
comment
Насколько я понимаю, в самой странице есть EOL (end-of-line) и вкладки, так что без них парсить не получится. Вы можете поэкспериментировать с использованием разных парсеров, но это тоже хорошо помогает. Комментарий «оставаться рядом» должен был показать, что мне нужно было лишь внести небольшие изменения в ваш код, чтобы он заработал. Конечно, есть дополнительные способы сделать это, но rvest стал довольно популярным. Альтернативы включают пакеты XML и xml2. - person Peter Verbeet; 31.05.2015
comment
Что ж, раз уж вы спрашиваете, я добавил к своему ответу альтернативный подход. Надеюсь, это полезно. Не стесняйтесь голосовать и принимать ответ, если он поможет вам решить вашу проблему. - person Peter Verbeet; 01.06.2015
comment
вы заслуживаете плюса. Спасибо. Но я все еще хочу знать: 1.- почему я получил товары из баннера в конце страницы. 2.- Что делает регулярное выражение в вашем ответе? Спасибо! - person Omar Gonzales; 03.06.2015
comment
Регулярное выражение заменяет ненужные \n, \r, \t пустым символом "", который удаляет их из строки. - person Peter Verbeet; 04.06.2015