проблемы с веб-циклом в rvest - PullRequest
0 голосов
/ 24 мая 2018

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

Этот код хорошо обрабатывается, но большая проблема в том, что он создает один длинный вектор вместо таблицы.Это первый выпуск.

Вторая проблема заключается в том, что если я попытаюсь загрузить веб-страницы из файла CSV, скрипт не запустится.Я получу следующую ошибку:

Ошибка в UseMethod ("read_xml"): нет применимого метода для read_xml, примененного к объекту класса "factor"

Это просто CSV с указанными URL-адресами.

Третья и последняя проблема заключается в том, что статья может иметь более одного электронного письма и, следовательно, более одной строки.Код игнорирует это.Например, статья http://journals.sagepub.com/doi/full/10.3102/0013189X17737739

library(rvest)
data<- c("http://journals.sagepub.com/doi/abs/10.3102/0013189X037001060", 
  "http://journals.sagepub.com/doi/abs/10.3102/0013189X037002102",
  "http://journals.sagepub.com/doi/abs/10.3102/0013189X037002104",
  "http://journals.sagepub.com/doi/full/10.3102/0013189X17737739")

scrape <- function(x){
  doc<-read_html(x)
  author <- html_text(html_nodes(doc, '.art_authors'))
  year <- html_text(html_nodes(doc, '.year'))
  journalName <- html_text(html_nodes(doc, '.journalName'))
  art_title <- html_text(html_nodes(doc, '.art_title'))
  volume <- html_text(html_nodes(doc, '.volume'))
  page <- html_text(html_nodes(doc, '.page'))
  email <- html_text(html_nodes(doc, xpath = "//a[@class = 'email']"))

  Author = ifelse(length(author)==0, NA, author)
  Year = ifelse(length(year)==0, NA, year)
  Journal_Name = ifelse(length(journalName)==0, NA, journalName) 
  Art_Title = ifelse(length(art_title)==0, NA, art_title)
  Volume = ifelse(length(volume)==0, NA, volume)
  Page = ifelse(length(page)==0, NA, page)
  Email = ifelse(length(email)==0, NA, email)

  row<-cbind(Author, Year, Journal_Name, Art_Title, Volume, Page, Email)
}

y <- lapply (data, scrape)

View (y)

, когда я пытаюсь запустить скрипт из csv

data<- read.csv ("link_test.csv")
y <- lapply (data$link, scrape)

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Для csv трудно ответить, не видя структуру файла, по крайней мере, пару строк.Однако проблема может быть решена следующим образом:

# bind your list items together as rows
df <- do.call(rbind, y)
# ensure each column is class character rather than factors
df <- as.data.frame(df, stringsAsFactors = FALSE)

РЕДАКТИРОВАТЬ: обновление, чтобы ответить на ваши изменения.В некоторых веб-страницах есть несколько авторов, которые, кажется, представляют веб-страницу в одном узле в виде текстовой строки, разделенной запятыми.Код, который вы разместили, похоже, не возвращает никаких писем для ваших примеров веб-страниц.Однако, если он вернул список или вектор электронных писем, вы можете свернуть их, вставив, как показано ниже:

Email = ifelse(length(email)==0, NA, do.call(paste, email, sep = ", "))
0 голосов
/ 24 мая 2018

Если вы вызовете эту функцию как последнюю строку, вы получите то, что вы хотите;)

y <- do.call(rbind, y)

library(DT)
datatable(y)

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

  Email = ifelse(length(email)==0, NA, 
          ifelse(length(email)==1, email, paste(email, collapse=" ; ")))

Но я этого не проверял, так как не нашел ни одной веб-страницы с несколькими адресами электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...