2017-01-31 2 views
0

Следующий код работает:R программирование: rvest: для данных цикла перезаписи Царапины

library(rvest) 
library(plyr) 

alaska <- c(1:49) 

for (i in alaska) { 

    url <- "http://www.50states.com/facts/alaska.htm" 

    nodespath <- paste('//*[@id="content"]/div[1]/div[4]/ol/li[',i,']') 

    alaskafacts <- data.frame(facts = url %>% html() %>% 
        html_nodes(xpath =nodespath) %>% html_text()) 

alaskafacts$nm <- i 
alaskafacts$facts <- alaskafacts$facts 

result <- rbind.fill(result,alaskafacts) 
} 

Я получаю это в результате:

enter image description here

Я знаю, что цикл работает потому, что если изменить код следующим образом:

alaska <- c(1:48) 

Я получаю это в результате:

enter image description here

Проблема Я бегу в цикл пишет над собой. Я ожидаю 49 строк фактов - я предполагаю, что цикл стирает предыдущий факт, а затем пишет новый - последний факт всегда будет фактом в data.frame.

Я нашел здесь пример: How can I use a loop to scrape website data for multiple webpages in R? и вышеописанный код следует за кодом в примере. И затем я ссылался на этот пример: here. И код, как мне кажется, следует за ним.

Звонок, который у меня внизу, следует за двумя аналогичными примерами, которые я нашел на SO, но не сохраняет, как ожидалось.

Любые предложения?


ответ

2

Перед циклом for необходимо предопределить переменную результатов. В настоящее время каждый раз через результаты цикла происходит перезапись. Попробуйте это:

library(rvest) 
library(plyr) 

alaska <- c(1:49) 
result<-data.frame() 
for (i in alaska) { 

    url <- "http://www.50states.com/facts/alaska.htm" 
.... 

Существует более быстрый способ вытащить вашу запрашиваемую информацию, не используя для цикла (и знать требуемую длину, прежде чем руки). rvest в векторную, чтобы все узлы потянуться в одном заявлении:

library(rvest) 

url <- "http://www.50states.com/facts/alaska.htm" 
page<-url %>% read_html() 

resultsarray<-html_text(html_nodes(page, "ol.stripedList li")) 
    # "ol.stripedList li" is the html code for the list hierarchical 
    # li (list element underneath) an ol (ordered list) of class "stripedList" 

resultsarray является массив строк с 49 фактов, я позволю вам преобразовать это желаемая dataframe.

+0

работает отлично. как вы знаете, что «ol.stripedList li» - это то, что мне нужно? –

+0

Это вопрос поиска кода html для определения интересующих блоков HTML-кода. Иногда немного проб и ошибок. Если вы посмотрите на виньетку rvest, в ней объясняется, как использовать инструмент «selectorgadget», который упрощает процесс. – Dave2e

+0

вы бы по-прежнему не рекомендуем использовать цикл for, если я хочу запускать все состояния, где 'states <- c (" все состояния ")' и что-то похожее на 'for (i во всех состояниях)' - Я думаю, что цикл был бы необходим, если бы это была моя игровая проблема. Как вы думаете? –

Смежные вопросы