чтение текста в R с проблемами XML - PullRequest
0 голосов
/ 31 января 2019

Сводка внизу поста

ЧАСТЬ 1: Я пытаюсь изменить функцию, чтобы она соответствовала моим данным, однако я сталкиваюсь со следующей ошибкой:

Error in mutate_impl(.data, dots) : 
  Evaluation error: Tibble columns must have consistent lengths, only values of length one are recycled:
* Length 0: Columns `node`, `text`
* Length 2: Column `nid`
Call `rlang::last_error()` to see a backtrace.

Часть функции, которую я пытаюсь запустить:

parse10k <- function(uri) {
  # 10-K HTML files are very flat with a long list of nodes. This pulls all
  # the relevant nodes.
  nodes <- read_html(uri) %>% 
    html_nodes('text') %>% 
    xml_children()
  nodes <- nodes[xml_name(nodes) != "hr"]

  # Unfortunately there isn't much of a workaround to this loop - we need
  # to track position in the file so it has to be a bit sequential...
  doc.parts <- tibble(nid = seq(length(nodes)),
                      node = nodes,
                      text = xml_text(nodes) ) %>% 
    filter(text != "") # way to get columns defined properly
}

Запустить функцию:

data2 <- df %>%
  rename_(ID = ".id") %>%
  rowwise() %>%
  filter(grepl(".htm", doc.href, fixed = TRUE)) %>%
  filter(!grepl(".html", doc.href, fixed = TRUE)) %>%
  mutate(nodes = map(doc.href, parse10k)) %>%
  #select(-accession_number, -href, -mdlink, -doc.href, -reportLink) %>%
  ungroup() %>%
  group_by(filing_date)

ОШИБКА:

Error in mutate_impl(.data, dots) : 
  Evaluation error: Tibble columns must have consistent lengths, only values of length one are recycled:
* Length 0: Columns `node`, `text`
* Length 2: Column `nid`
Call `rlang::last_error()` to see a backtrace.

ЧАСТЬ 2 Проблема, кажется, из-за нескольких ссылок: я вынул все из ранее определенной функции и проверил каждую ссылку через нее, и подозрительная ссылка следующая: (код внизу ЧАСТИ 2)

«плохая» ссылка: https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm

, которая возвращает фрейм данных parts из 110 наблюдений ...

# A tibble: 110 x 2
     nid text     
   <dbl> <chr>    
 1     0 PART 0   
 2    21 "PART I "
 3    26 "PART I "
 4    41 "PART I "
 5    66 "PART I "
 6    93 "PART I "
 7   126 "PART I "
 8   147 "PART I "
 9   171 "PART I "
10   191 "PART I "
# ... with 100 more rows

Принимая во внимание эту ссылку:

«хорошая» ссылка: https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/fy2009form10k.htm

Возвращает правильное число parts.

# A tibble: 4 x 2
    nid text   
  <dbl> <chr>  
1     0 PART 0 
2    65 PART I 
3   651 PART II
4   693 NA     

Это код, через который я запускаю ссылки:

url <- "https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm"
nodes <- NULL; doc.parts <- NULL; parts <- NULL
nodes <- read_html(url) %>%
html_nodes('text') %>%
xml_children()
nodes <- nodes[xml_name(nodes) != "hr"]
doc.parts <- tibble(nid = seq(length(nodes)),
                     node = nodes,
                     text = xml_text(nodes) ) %>%
   filter(text != "")
parts <- doc.parts %>%
   filter(grepl("^part",text, ignore.case=TRUE)) %>%
   select(nid,text)
#  mutate(next.nid = c(nid[-1],length(nodes)+1)) %>%
if (parts$nid[1] > 1) {
   parts <- bind_rows(tibble(nid = 0, text= "PART 0"), parts)
}
parts <- bind_rows(parts,
                    tibble(nid = doc.parts$nid[length(doc.parts$nid)] + 1,
                           text = "NA"))

ЧАСТЬ 3 Я также рассмотрел фреймы данных doc.parts, и они отличаются.Под столбцом node «хорошая» ссылка выглядит следующим образом:

{xml_nodeset (6)}
[1] <title>fy2009form10k.htm</title>\n
[2] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[3] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[4] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[5] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[6] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...

Тогда как «плохая» ссылка выглядит следующим образом:

{xml_nodeset (6)}
[1] <title>10-K</title>\n
[2] <h5 align="left"><a href="#toc">Table of Contents</a></h5>
[3] <div style="width:97%; margin-top:1.5%; margin-left:1.5%; margin-ri ...
[4] <p style="page-break-before:always">\n</p>\n
[5] <h5 align="left"><a href="#toc">Table of Contents</a></h5>
[6] <div style="width:97%; margin-top:1.5%; margin-left:1.5%; margin-ri ...

Так что здесь что-то не так в этой частив функции (из части 1):

doc.parts <- tibble(nid = seq(length(nodes)),
                    node = nodes,
                    text = xml_text(nodes) ) %>%
  filter(text != "")

В частности, с частью xml_text(nodes).

Вопрос: Есть ли способ узнать заранее, какие могут быть "плохие" ссылки?- Я попытался удалить все ссылки .txt и .html, которые не могут быть прочитаны функцией, но некоторые ссылки .htm вызывают проблемы.- Я бы предпочел не удалять их, но при необходимости я буду.Будет ли здесь полезен tryCatch()?

ЧАСТЬ 4 Поскольку веб-страницы различаются, я получаю разные длины списка, когда снова запускаю ссылки через цикл for.

links <- c("https://www.sec.gov/Archives/edgar/data/27419/000002741914000014/tgt-20140201x10k.htm", 
"https://www.sec.gov/Archives/edgar/data/1090012/000095013409003904/d66379e10vk.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312511200680/d10k.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312504150689/d10k.htm", 
"https://www.sec.gov/Archives/edgar/data/27904/000002790417000004/dal1231201610k.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746912001478/a2207295z10-k.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746905006608/a2152901z10-k.htm", 
"https://www.sec.gov/Archives/edgar/data/27419/000104746910002121/a2196751z10-k.htm", 
"https://www.sec.gov/Archives/edgar/data/98246/000095012309005683/y75075e10vk.htm", 
"https://www.sec.gov/Archives/edgar/data/818479/000081847914000004/dentsply201310-k.htm", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/fy2009form10k.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746913001494/a2212713z10-k.htm", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581015000036/nvda-2015x10k.htm", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581011000015/fy2011form10k.htm", 
"https://www.sec.gov/Archives/edgar/data/1090012/000119312514076267/d656849d10k.htm"
)

Когда я запускаю это для цикла

nodes <- NULL; doc.parts <- NULL; parts <- NULL


for(link in links){
nodes[[link]] <- read_html(link) %>%
  html_nodes('text') %>%
  xml_children()
nodes[[link]] <- nodes[xml_name(nodes[[link]]) != "hr"]
doc.parts[[link]] <- tibble(nid = seq(length(nodes)),
                    node = nodes)
                    #text = xml_text(nodes) ) %>%
  #filter(text != "")

}

Я получаю эту ошибку:

Error in UseMethod("xml_text") : 
  no applicable method for 'xml_text' applied to an object of class "list"

, которая также может вызывать проблемы с функцией.

Однако, если я закомментирую проблемные строки, я не получу сообщение об ошибке:

for(link in links){
nodes[[link]] <- read_html(link) %>%
  html_nodes('text') %>%
  xml_children()
nodes[[link]] <- nodes[xml_name(nodes[[link]]) != "hr"]
doc.parts[[link]] <- tibble(nid = seq(length(nodes[[link]])))
                    #node = nodes[[link]])
                    #text = xml_text(nodes[[link]]) ) %>%
  #filter(text != "")

}

Где doc.parts - список различной длины.

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

#

Данные:

df <- structure(list(.id = c("TGT", "DVN", "XRAY", "XRAY", "MSFT", 
"MSFT", "DAL", "AON", "AON", "TGT", "TGT", "TIF", "XRAY", "NVDA", 
"MSFT", "AON", "MSFT", "NVDA", "NVDA", "DVN"), accession_number = c("0000027419-14-000014", 
"0000950134-09-003904", "0000818479-04-000031", "0000818479-99-000003", 
"0001193125-11-200680", "0001193125-04-150689", "0000027904-17-000004", 
"0001047469-12-001478", "0001047469-05-006608", "0001047469-10-002121", 
"0001047469-98-015191", "0000950123-09-005683", "0000818479-14-000004", 
"0001045810-09-000013", "0001193125-15-272806", "0001047469-13-001494", 
"0000891020-95-000433", "0001045810-15-000036", "0001045810-11-000015", 
"0001193125-14-076267"), act = c("34", "34", NA, NA, "34", NA, 
"34", "34", "34", "34", NA, "34", "34", "34", "34", "34", NA, 
"34", "34", "34"), file_number = c("001-06049", "001-32318", 
"000-16211", "000-16211", "000-14278", "000-14278", "001-05424", 
"001-07933", "001-07933", "001-06049", "001-06049", "001-09494", 
"000-16211", "000-23985", "000-14278", "001-07933", "000-14278", 
"000-23985", "000-23985", "001-32318"), filing_date = structure(c(1394751600, 
1235689200, 1079305200, 922744800, 1311804000, 1093989600, 1486940400, 
1330038000, 1110927600, 1268348400, 892591200, 1238364000, 1392850800, 
1236898800, 1438293600, 1361487600, 811983600, 1426114800, 1300230000, 
1393542000), class = c("POSIXct", "POSIXt"), tzone = ""), accepted_date = structure(c(1394751600, 
1235689200, 1079305200, 922744800, 1311804000, 1093989600, 1486940400, 
1330038000, 1110841200, 1268348400, 892591200, 1238364000, 1392850800, 
1236898800, 1438293600, 1361487600, 811983600, 1426028400, 1300230000, 
1393542000), class = c("POSIXct", "POSIXt"), tzone = ""), href = c("https://www.sec.gov/Archives/edgar/data/27419/000002741914000014/0000027419-14-000014-index.htm", 
"https://www.sec.gov/Archives/edgar/data/1090012/000095013409003904/0000950134-09-003904-index.htm", 
"https://www.sec.gov/Archives/edgar/data/818479/000081847904000031/0000818479-04-000031-index.htm", 
"https://www.sec.gov/Archives/edgar/data/818479/0000818479-99-000003-index.html", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312511200680/0001193125-11-200680-index.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312504150689/0001193125-04-150689-index.htm", 
"https://www.sec.gov/Archives/edgar/data/27904/000002790417000004/0000027904-17-000004-index.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746912001478/0001047469-12-001478-index.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746905006608/0001047469-05-006608-index.htm", 
"https://www.sec.gov/Archives/edgar/data/27419/000104746910002121/0001047469-10-002121-index.htm", 
"https://www.sec.gov/Archives/edgar/data/27419/0001047469-98-015191-index.html", 
"https://www.sec.gov/Archives/edgar/data/98246/000095012309005683/0000950123-09-005683-index.htm", 
"https://www.sec.gov/Archives/edgar/data/818479/000081847914000004/0000818479-14-000004-index.htm", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/0001045810-09-000013-index.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/0001193125-15-272806-index.htm", 
"https://www.sec.gov/Archives/edgar/data/315293/000104746913001494/0001047469-13-001494-index.htm", 
"https://www.sec.gov/Archives/edgar/data/789019/0000891020-95-000433-index.html", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581015000036/0001045810-15-000036-index.htm", 
"https://www.sec.gov/Archives/edgar/data/1045810/000104581011000015/0001045810-11-000015-index.htm", 
"https://www.sec.gov/Archives/edgar/data/1090012/000119312514076267/0001193125-14-076267-index.htm"
), type = c("10-K", "10-K", "10-K", "10-K", "10-K", "10-K", "10-K", 
"10-K", "10-K", "10-K", "10-K", "10-K", "10-K", "10-K", "10-K", 
"10-K", "10-K", "10-K", "10-K", "10-K"), film_number = c("14693644", 
"09639574", "04670190", "99578860", "11993262", "041011640", 
"17600107", "12638817", "05683013", "10676542", "98594743", "09714434", 
"14630484", "09677521", "151019135", "13634337", "95575998", 
"15694143", "11692266", "14653539"), form_name = c("Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]", "Annual report [Section 13 and 15(d), not S-K Item 405]", 
"Annual report [Section 13 and 15(d), not S-K Item 405]"), description = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    size = c("20 MB", "2 MB", "687 KB", "309 KB", "16 MB", "1 MB", 
    "14 MB", "22 MB", "2 MB", "6 MB", "201 KB", "1 MB", "35 MB", 
    "4 MB", "14 MB", "24 MB", "189 KB", "16 MB", "19 MB", "41 MB"
    ), doc.href = c("https://www.sec.gov/Archives/edgar/data/27419/000002741914000014/tgt-20140201x10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/1090012/000095013409003904/d66379e10vk.htm", 
    "https://www.sec.gov/Archives/edgar/data/818479/000081847904000031/f102003.txt", 
    "https://www.sec.gov/Archives/edgar/data/818479/", "https://www.sec.gov/Archives/edgar/data/789019/000119312511200680/d10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/789019/000119312504150689/d10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/27904/000002790417000004/dal1231201610k.htm", 
    "https://www.sec.gov/Archives/edgar/data/315293/000104746912001478/a2207295z10-k.htm", 
    "https://www.sec.gov/Archives/edgar/data/315293/000104746905006608/a2152901z10-k.htm", 
    "https://www.sec.gov/Archives/edgar/data/27419/000104746910002121/a2196751z10-k.htm", 
    "https://www.sec.gov/Archives/edgar/data/27419/", "https://www.sec.gov/Archives/edgar/data/98246/000095012309005683/y75075e10vk.htm", 
    "https://www.sec.gov/Archives/edgar/data/818479/000081847914000004/dentsply201310-k.htm", 
    "https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/fy2009form10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/315293/000104746913001494/a2212713z10-k.htm", 
    "https://www.sec.gov/Archives/edgar/data/789019/", "https://www.sec.gov/Archives/edgar/data/1045810/000104581015000036/nvda-2015x10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/1045810/000104581011000015/fy2011form10k.htm", 
    "https://www.sec.gov/Archives/edgar/data/1090012/000119312514076267/d656849d10k.htm"
    ), mdlink = c("[Filing Link](https://www.sec.gov/Archives/edgar/data/27419/000002741914000014/0000027419-14-000014-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/1090012/000095013409003904/0000950134-09-003904-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/818479/000081847904000031/0000818479-04-000031-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/818479/0000818479-99-000003-index.html)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/789019/000119312511200680/0001193125-11-200680-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/789019/000119312504150689/0001193125-04-150689-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/27904/000002790417000004/0000027904-17-000004-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/315293/000104746912001478/0001047469-12-001478-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/315293/000104746905006608/0001047469-05-006608-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/27419/000104746910002121/0001047469-10-002121-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/27419/0001047469-98-015191-index.html)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/98246/000095012309005683/0000950123-09-005683-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/818479/000081847914000004/0000818479-14-000004-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/0001045810-09-000013-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/0001193125-15-272806-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/315293/000104746913001494/0001047469-13-001494-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/789019/0000891020-95-000433-index.html)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581015000036/0001045810-15-000036-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581011000015/0001045810-11-000015-index.htm)", 
    "[Filing Link](https://www.sec.gov/Archives/edgar/data/1090012/000119312514076267/0001193125-14-076267-index.htm)"
    ), reportLink = c("[10-K Link](https://www.sec.gov/Archives/edgar/data/27419/000002741914000014/tgt-20140201x10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/1090012/000095013409003904/d66379e10vk.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/818479/000081847904000031/f102003.txt)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/818479/)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/789019/000119312511200680/d10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/789019/000119312504150689/d10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/27904/000002790417000004/dal1231201610k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/315293/000104746912001478/a2207295z10-k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/315293/000104746905006608/a2152901z10-k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/27419/000104746910002121/a2196751z10-k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/27419/)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/98246/000095012309005683/y75075e10vk.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/818479/000081847914000004/dentsply201310-k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/fy2009form10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/315293/000104746913001494/a2212713z10-k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/789019/)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581015000036/nvda-2015x10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/1045810/000104581011000015/fy2011form10k.htm)", 
    "[10-K Link](https://www.sec.gov/Archives/edgar/data/1090012/000119312514076267/d656849d10k.htm)"
    )), row.names = c(64L, 158L, 143L, 148L, 90L, 97L, 109L, 
24L, 31L, 68L, 80L, 49L, 133L, 10L, 86L, 23L, 106L, 4L, 8L, 153L
), class = "data.frame")

РЕДАКТИРОВАТЬ1: Некоторые пакеты:

library(dplyr)
library(plyr)
library(purrr)
library(edgarWebR)
library(rvest)
library(devtools)
library(tidyr)
library(tidytext)
library(stringr)
library(tibble)

EDIT2: (Summary)

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь прочитать несколько ссылок .htm.Для большинства ссылок все работает гладко и корректно, однако, когда в списке ссылок есть «плохие» ссылки, вся функция выдает ошибку.Я проанализировал проблему и думаю, что ошибка происходит из одной части кода, в частности из этой части doc.parts, и из-за того, что код пытается прочитать два разных кода HTML / XML.

При использовании «плохого» URL-адреса формат doc.parts - node column выглядит следующим образом:

> head(doc.parts$node)
{xml_nodeset (6)}
[1] <title>10-K</title>\n
[2] <h5 align="left"><a href="#toc">Table of Contents</a></h5>
[3] <div style="width:97%; margin-top:1.5%; margin-left:1.5%; margin-ri ...
[4] <p style="page-break-before:always">\n</p>\n
[5] <h5 align="left"><a href="#toc">Table of Contents</a></h5>
[6] <div style="width:97%; margin-top:1.5%; margin-left:1.5%; margin-ri ...

, что вызывает все виды проблем.Однако, когда я запускаю «хороший» URL, тот же столбец выглядит следующим образом:

> head(doc.parts$node)
{xml_nodeset (6)}
[1] <title>fy2009form10k.htm</title>\n
[2] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[3] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[4] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[5] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...
[6] <div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MAR ...

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

EDIT 3: Следующий «плохой» URL читается как large xml_nodes объект.

url <- "https://www.sec.gov/Archives/edgar/data/789019/000119312515272806/d918813d10k.htm"

nodes <- read_html(url) %>% 
  html_nodes('text') %>%
  xml_children()

«Хороший» URL читается как список из 692

url2 <- "https://www.sec.gov/Archives/edgar/data/1045810/000104581009000013/fy2009form10k.htm"

nodes2 <- read_html(url2) %>%
  html_nodes('text') %>%
  xml_children()

1 Ответ

0 голосов
/ 01 февраля 2019

Автор кода, который, по моему мнению, пытается использовать здесь из исследования, которое я делал еще в 2007 году, обрабатывая HTML заявок SEC - https://micah.waldste.in/blog/2017/10/introduction-to-sentiment-analysis-of-10-k-reports-in-r/

tl; dr;Не используйте этот код, используйте библиотеку edgarWebR R, которая построена на этом подходе и является гораздо более надежной для навигации по сайту SEC и анализа заявок и форм.

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

seq vs seq_along

Я думаю, что все поймут это в какой-то момент - вкод для создания таблицы есть этот блок -

doc.parts <- tibble(nid = seq(length(nodes)),
                    node = nodes,
                    text = xml_text(nodes) ) %>%
...

Ошибка в том, что в случае, если вы сталкиваетесь, nodes - это длина 0. xml_text(nodes) также равна длине 0, но очень забавночто-то происходит для nid ... Хотя мы хотим, чтобы оно также имело длину 0, seq(0) возвращает c(1, 0), длину 2 ...

Мораль истории: если вам нужны идентификаторы для предметовв списке используйте seq_along(nodes), а не seq(length(nodes)), чтобы в случае длины 0 он не ломался.

Анализ документов SEC - это плохо

Другой неотложный вопрос должен быть "хорошо, почему синтаксический анализ не дает никакой длины? Наличие этого создает результат0 длины не годится ".

К сожалению, заявки SEC, хотя они стандартизированы в HTML, являются самым уродливым, наименее стандартизированным HTML на планете.Каждая компания делает что-то немного по-другому или использует эти «стандартизированные формы» как возможность «Бренд».Разбор их - это больше усилий в грубой силе, чем в умной обработке.

Вот почему код, который вы пробовали, иногда работал, а иногда и не работал - зависит от того, насколько точно отформатирован конкретный файл.

Избегайте прямой боли

ИспользуйтеПакет R edgarWebR , если вы пытаетесь разобрать заявки SEC - мы играли в дурака с конкретными проблемами разбора - это не красиво, но работает.

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