Извлечение данных из тегов HTML в R - PullRequest
0 голосов
/ 31 октября 2018

У меня есть HTML-таблица, из которой я пытаюсь извлечь данные. У меня есть строка 21, из которой мне нужно получить вектор из 11 символов (а затем сделать то же самое для всех строк данных. Я пытаюсь написать функцию для этого, где:

dt - это моя таблица данных, и вот как выглядит строка 21:

[1] "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td> 
<td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td> 
<td>2.7</td></tr>"

Мне нужно избавиться от всех «<tr><td>» и т. Д., А также вставить 0 или NA, где они существуют вплотную ("</td><td></td><td>").

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

Ошибка в strsplit (a, "</td><td>"): не символьный аргумент

f<-function(row.data){
 a<-strsplit(row.data,"<tr><td>")
        b<-unlist(strsplit(a,"</td><td>")))
}
f(dt[21])

И это еще касается адреса вставки 0 или NA. Я довольно новичок в R, поэтому я очень благодарен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

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

Если вместо этого у вас есть просто строки тегов HTML для каждой строки, вы можете преобразовать этот текст в его представление XML (основу HTML) с помощью read_html. Затем из этого XML вы можете извлечь теги <tr>, затем из этих извлечь теги <td>. Я сделал строки таблицы перед ячейками таблицы на случай, если вам понадобится больше логики для хранения строк.

library(dplyr)
library(rvest)

tags <- "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td> 
<td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td> 
<td>2.7</td></tr>"

read_html(tags) %>%
  html_nodes("tr") %>%
  html_nodes("td")
#> {xml_nodeset (11)}
#>  [1] <td>1</td>\n
#>  [2] <td>11 Com</td>\n
#>  [3] <td>b</td>\n
#>  [4] <td>Radial Velocity</td>
#>  [5] <td>1</td>\n
#>  [6] <td>326.03</td>\n
#>  [7] <td>1.29</td>\n
#>  [8] <td></td>\n
#>  [9] <td>19.4</td>\n
#> [10] <td></td>
#> [11] <td>2.7</td>

Затем html_text извлекает внутренний текст из каждого тега.

read_html(tags) %>%
  html_nodes("tr") %>%
  html_nodes("td") %>%
  html_text()
#>  [1] "1"               "11 Com"          "b"              
#>  [4] "Radial Velocity" "1"               "326.03"         
#>  [7] "1.29"            ""                "19.4"           
#> [10] ""                "2.7"

Создано в 2018-10-31 пакетом Представление (v0.2.1)

0 голосов
/ 31 октября 2018

Это можно сделать с помощью gsub. Как прокомментировано, вы действительно должны избежать / с \\

dat <-  "<tr><td>1</td><td>11 Com</td><td>b</td><td>Radial Velocity</td><td>1</td><td>326.03</td><td>1.29</td><td></td><td>19.4</td><td></td><td>2.7</td></tr>"
a<-gsub("<tr>",0,dat)
a<-gsub("<td>",0,a) 
a<-gsub("<\\/td>",0,a) 
a<-gsub("<\\/tr>",0,a) 
a
[1] "0010011 Com00b00Radial Velocity0 \n0100326.03001.29000019.4000 \n02.700"
...