R: Парсинг группы html файлов с циклом

Следующий код работает для отдельных файлов .html:

doc <- htmlParse("New folder/1-4.html")
plain.text <- xpathSApply(doc, "//td", xmlValue)
plain.text <- gsub("\n", "", plain.text)
gregexpr("firstThing", plain.text)
firstThing <- substring(plain.text[9], 41, 50)
gregexpr(secondThing, plain.text)
secondThing <- substring(plain.text[7], 1, 550)

Но следующий цикл не работает и дает мне ошибку:

Содержимое XML не похоже на XML

file.names <-  dir(path = "New folder")

for(i in 1:length(file.names)){
doc <- htmlParse(file.names[i])
plain.text <- xpathSApply(doc, "//td", xmlValue)
gsub("\n", "", plain.text)
firstThing[i] <- substring(plain.text[9], 41, 50)
secondThing[i] <- substring(plain.text[7], 1, 550)
  }

Я просто пытаюсь извлечь информацию (как мне удалось сделать в первой партии кода) и создать информационный вектор.

Любые идеи о том, как решить эту проблему?


person user2880936    schedule 21.09.2015    source источник
comment
Да, и спасибо, что указали на это, но это все еще не решает проблему с ошибкой.   -  person user2880936    schedule 21.09.2015


Ответы (1)


Две вещи. Во-первых, ваши пути были неправильными. Чтобы исправить это, используйте:

filenames = dir(path = "New folder", full.names = TRUE)

Во-вторых, лучше, чем заполнять две переменные внутри цикла for, генерировать структурированные данные в функции списка:

result = lapply(filenames, function (filename) {
    doc = htmlParse(filename)
    plain_text = xpathSApply(doc, "//td", xmlValue)
    c(first = substring(plain_text[9], 41, 50),
      second = substring(plain_text[7], 1, 550))
})

Теперь result — это список элементов, где каждый элемент — это вектор с именами first и second.

Несколько других замечаний:

  • Будьте осторожны с точками в именах переменных — S3 использует точки в именах для определения класса универсального метода. Использование точек вместо чего-либо еще в именах переменных вызывает путаницу, и этого следует избегать.

  • Оператор gsub в вашем цикле не действует.

person Konrad Rudolph    schedule 21.09.2015
comment
На самом деле, это возвращает одну и ту же информацию в каждую ячейку, поэтому не похоже, что она зацикливается на файлах. Какие-нибудь мысли? - person user2880936; 21.09.2015
comment
@user2880936 user2880936 Простая опечатка, теперь ее нужно исправить. - person Konrad Rudolph; 21.09.2015
comment
Замечательно. Спасибо Конрад. - person user2880936; 21.09.2015