2014-12-05 4 views
1

Вот код, я бегуRvest ошибки выскабливание

library(rvest) 

rootUri <- "https://github.com/rails/rails/pull/" 
PR <- as.list(c(100, 200, 300)) 
list <- paste0(rootUri, PR) 
messages <- lapply(list, function(l) { 
    html(l) 
}) 

До этого момента он, кажется, работает хорошо, но когда я пытаюсь извлечь текст:

html_text(messages) 

я получаю:

Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) : 
    Unknown input of class: list 

Попытка извлечь конкретный элемент:

html_text(messages[1]) 

Не можете сделать это либо ...

Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) : 
    Unknown input of class: list 

Так что попробуйте другой способ:

html_text(messages[[1]]) 

Это, кажется, по крайней мере, получить на данные, но до сих пор не успешным :

Error in UseMethod("xmlValue") : 
    no applicable method for 'xmlValue' applied to an object of class "c('HTMLInternalDocument',  'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument')" 

Как извлечь текстовый материал из каждого элемента моего списка?

+0

Почему вы не используете API GitHub? У него есть глаголы для [pull request] (https://developer.github.com/v3/pulls/). – hrbrmstr

+0

API github делит комментарии на несколько категорий (проблемы, запросы на перенос, коммит), что означает, что мне приходится писать относительный сложный запрос. В Интернете у меня есть все, что централизовано на одной странице. – histelheim

ответ

5

Есть два проблемы с вашим кодом. Look here for examples on how to use the package.

1. Вы не можете просто использовать каждую функцию со всем.

  • html() для загрузки контента
  • html_node() для выбора узла (ов) из загруженного контента страницы
  • html_text() для извлечения текста из ранее выбранного узла

Поэтому, чтобы загрузить одну из ваших страниц и извлечь текст html-узла, используйте это:

library(rvest) 

старой школы стиля:

url   <- "https://github.com/rails/rails/pull/100" 
url_content <- html(url) 
url_mainnode <- html_node(url_content, "*") 
url_mainnode_text <- html_text(url_mainnode) 
url_mainnode_text 

... или это ...

трудно читать старой школы стиля:

url_mainnode_text <- html_text(html_node(html("https://github.com/rails/rails/pull/100"), "*")) 
url_mainnode_text 

... или это ...

стиль magritr-кант

url_mainnode_text <- 
    html("https://github.com/rails/rails/pull/100") %>% 
    html_node("*") %>% 
    html_text() 
url_mainnode_text 

2. При использовании списков вы должны применять функции к списку, например, lapply()

Если вы хотите вид пакетной обработки несколько URL-адресов, вы можете попробовать что-то вроде этого:

url_list <- c("https://github.com/rails/rails/pull/100", 
        "https://github.com/rails/rails/pull/200", 
        "https://github.com/rails/rails/pull/300") 

    get_html_text <- function(url, css_or_xpath="*"){ 
     html_text(
     html_node(
      html("https://github.com/rails/rails/pull/100"), css_or_xpath 
     ) 
    ) 
    } 

lapply(url_list, get_html_text, css_or_xpath="a[class=message]") 
+0

Можете ли вы мне помочь в этом. Я не могу извлечь значения. http://stackoverflow.com/questions/31423931/extract-data-from-raw-html-in-r –

1

Вы должны использовать html_nodes() и определить, какие CSS селекторы относятся к данным, вы заинтересованы. Например, если мы хотим, чтобы извлечь имена людей обсуждают тянуть 200

rootUri <- "https://github.com/rails/rails/pull/200" 
page<-html(rootUri) 
page %>% html_nodes('#discussion_bucket strong a') %>% html_text() 

[1] "jaw6"  "jaw6"  "josevalim" 
Смежные вопросы