2016-08-17 2 views
0

Опираясь на ответ на former question of mine я выскабливание this website для связи с Rselenium-пакета, используя следующий код:соскабливания HTML из вектора строк в R

startServer() 
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4444, 
        browserName = "chrome") 

remDr$open(silent = TRUE) 
remDr$navigate("http://karakterstatistik.stads.ku.dk/") 
Sys.sleep(2) 

webElem <- remDr$findElement("name", "submit") 
webElem$clickElement() 
Sys.sleep(5) 

html_source <- vector("list", 100) 
i <- 1 
while (i <= 100) { 
    html_source[[i]] <- remDr$getPageSource() 
    webElem <- remDr$findElement("id", "next") 
    webElem$clickElement() 
    Sys.sleep(2) 
    i <- i + 1 
} 
Sys.sleep(3) 
remDr$close() 

Когда я хочу, чтобы скоблить выше создана вектор строк (html_source), используя rvest-пакет, я получаю сообщение об ошибке, как источник не является HTML-файл:

kar.links = html_source %>% 
    read_html(encoding = "UTF-8") %>% 
    html_nodes("#searchResults a") %>% 
    html_attr("href") 

Я попытался свернуть вектор и пытался искать струнный-to HTML-конвертер, но ничего не работает. Я чувствую, что решение лежит где-то в том, как я сохраняю источники страниц в цикле.

EDIT: исправлен его это менее красивое решение:

links <- vector("list", 100) 
i <- 1 
while (i <= 100) { 
links[[i]] <- html_source[[i]][[1]] %>% 
    read_html(encoding = "UTF-8") %>% 
    html_nodes("#searchResults a") %>% 
    html_attr("href") 
i <- i + 1 
} 
col_links<- links %>% 
unlist() 

ответ

1

html_source является вложенным списком:

str(head(html_source, 3)) 
# List of 3 
# $ :List of 1 
# ..$ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 
# $ :List of 1 
# ..$ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 
# $ :List of 1 
# ..$ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 

В вашем случае, html_source состоит из 100 элементов; каждый элемент сам представляет собой список с одним элементом, который представляет собой строку (и необработанный HTML-код). Поэтому, чтобы получить каждую сырую html-страницу, вам необходимо получить доступ к html_source[[1]][[1]], html_source[[2]][[1]] и так далее.

Чтобы свернуть html_source, вы можете сделать: lapply(html_source, `[[`, 1). Мы получаем тот же результат, если мы используем remDr$getPageSource()[[1]] в цикле while: снова

str(head(html_source, 3)) 
# List of 3 
# $ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 
# $ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 
# $ : chr "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n <title>Karakterfordeling</title>\n <link rel=\"icon\"| __truncated__ 
+0

Спасибо. Метод html_source [[1]] [[1]] работает как шарм, поэтому я могу извлечь ссылки из каждого объекта в списке. Функция lapply() работает также. Итак, чтобы получить ссылки от каждого из 100 объектов, мне нужно зацикливать функции hrvest? Или есть другой способ, чтобы это можно было сделать одним простым шагом? _EDIT: нажать слишком быстро_ – ScrapeGoat

+0

Вы можете свернуть список, используя 'unlist', а затем использовать' paste (..., collapse = "") 'для получения одной (очень) длинной символьной строки, которую вы можете проанализировать для ссылок , –

+0

Используя следующий код w/и без функции lapply, по какой-либо причине генерирует вектор из 179 ссылок? плоские <-lapply (html_source, '[[', 1)%>% unlist()%>% пасты (коллапс = '') ссылки <- flat %>% read_html (кодирование = "UTF-8")%>% html_nodes ("# searchResults a")%>% html_attr ("href") – ScrapeGoat