Разбор HTML в R с использованием XML и RCurl

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

require(RCurl)
require(XML)
html <- getURL("http://www.sec.gov/Archives/edgar/data/8947/000119312506125763/0001193125-06-125763.txt")
doc <- htmlParse(html, asText=TRUE)

Это сообщение об ошибке, которое я получаю:

Ошибка: XML-содержимое не похоже на XML и не идентифицирует имя файла

Я работаю на Mac:

> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.8          rJava_0.9-4       R.utils_1.26.2    R.oo_1.13.9       R.methodsS3_1.4.4 gsubfn_0.6-5      proto_0.3-10      RCurl_1.95-4.1   
[9] bitops_1.0-6      splus2R_1.2-0     stringr_0.6.2     foreign_0.8-54    XML_3.95-0.2     

loaded via a namespace (and not attached):
[1] tcltk_3.0.1 tools_3.0.1

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


person user1389960    schedule 03.11.2013    source источник
comment
Работает на R версии 2.15.2 (2012-10-26) Платформа: x86_64-apple-darwin9.8.0/x86_64 (64-разрядная версия)   -  person colcarroll    schedule 04.11.2013


Ответы (2)


Вам не нужен curl, чтобы получить файл, встроенные инструменты могут читать тест с URL-адресов (например, scan или read.table).

Причина, по которой вы получаете эту ошибку, заключается в том, что файл не является допустимым XML или HTML. Удалите все строки перед тегом <HTML>, и все будет готово.

sec <- scan(file = "http://www.sec.gov/Archives/edgar/data/8947/000119312506125763/0001193125-06-125763.txt", what = "character", sep ="\n",  allowEscapes = TRUE)
sec <- sec[56:length(sec)]
secHTML <- htmlParse(sec)

Есть и другие, менее уродливые способы получить файл, но как только вы удалите «текстовую» преамбулу, XML сможет его проанализировать.

С другой стороны, я думаю, что у htmlParse есть параметр, который позволяет вам указать количество пропускаемых строк.

person Adam Hyland    schedule 03.11.2013
comment
Спасибо. Я немного изменил ваше решение: sec <- scan(file = "http://www.sec.gov/Archives/edgar/data/8947/000119312506125763/0001193125-06-125763.txt", what = "character", sep ="\n", allowEscapes = TRUE) sec <- sec[grep("<HTML>", sec)[1]:length(sec)] secHTML <- htmlParse(sec) - person user1389960; 23.11.2013
comment
Старайтесь не искать теги HTML. Это довольно безобидно, но может привести к странным неприятностям. - person Adam Hyland; 28.11.2013

Файлы, хранящиеся на веб-сайте www.sec.gov, представляют собой смесь различных типов файлов. Некоторые из них представляют собой обычный текст, некоторые в формате jpg, некоторые в формате gif, некоторые в формате pdf, некоторые в формате XML, некоторые в формате XBRL, некоторые в формате html и другие. Файл примера, который вы используете, относится к типу файла «RAW Dissemination», который на самом деле представляет собой комбинацию любого или всех других типов.

Имя файла «0001193125-06-125763.txt» представляет собой объединение «Номера доступа» и расширения txt. Этот файл распространения RAW состоит из данных заголовка и серии наборов тегов «‹DOCUMENT› ....‹/DOCUMENT›». Между начальным и конечным тегом DOCUMENT находятся различные «файлы» внутри «регистрации».

Каждый из различных файлов в файле следует рассматривать отдельно. Типы файлов PDFS, JPG, GIF кодируются UUEncode и должны быть декодированы UU. Другие, такие как TXT, HTML, XML, XBRL, следует рассматривать как обычный текст и, при необходимости, анализировать как соответствующий тип.

Данные заголовка помечают информацию о компаниях, людях, регистраторах, агентах и ​​т. д., подавших заявку.

person Krazick    schedule 11.11.2013