Как разобрать HTML-текст, используя R? - PullRequest
1 голос
/ 21 октября 2019

У меня есть образцы html-кодов для таблицы

                        <td class="rgGroupCol">&nbsp;</td><td>Hope, Bob</td><td>7</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">7</td><td style="background-color:#F3ECCC;">7</td><td style="background-color:#F3ECCC;">0</td>
                        <td class="rgGroupCol">&nbsp;</td><td>Tan, Sally </td><td>76</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">76</td><td style="background-color:#F3ECCC;">23</td><td style="background-color:#F3ECCC;">53</td>
                        <td class="rgGroupCol">&nbsp;</td><td>Smith, Mark</td><td>2</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">2</td><td style="background-color:#F3ECCC;">0</td><td style="background-color:#F3ECCC;">2</td>

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

X1          X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 
Hope, Bob    7  0  0 0%  0 0%  0 0%  7   7   0 
Tan, Sally  76  0  0 0%  0 0%  0 0% 76  23  53
Smith, Mark  2  0  0 0%  0 0%  0 0%  2   0   2

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

test <- read_delim("eval num.txt", delim = "\n", col_names = FALSE)
test$X1 <- str_match(test$X1, "<td>[a-zA-Z0-9%,. ]+</td>")

Пожалуйста, просветите меня. Спасибо!

1 Ответ

1 голос
/ 21 октября 2019

Ваш первый блок кода не является корректной таблицей HTML, поэтому у вас возникнут проблемы. Он должен быть заключен в <table> ... </table>, а каждая строка должна быть заключена в <tr>...</tr>. Я не вижу ни одного из этих тегов в вашем образце.

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

<table> 
<tr><td class="rgGroupCol">&nbsp;</td><td>Hope, Bob</td><td>7</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">7</td><td style="background-color:#F3ECCC;">7</td><td style="background-color:#F3ECCC;">0</td></tr>
                       <tr><td class="rgGroupCol">&nbsp;</td><td>Tan, Sally </td><td>76</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">76</td><td style="background-color:#F3ECCC;">23</td><td style="background-color:#F3ECCC;">53</td></tr>
                       <tr> <td class="rgGroupCol">&nbsp;</td><td>Smith, Mark</td><td>2</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">2</td><td style="background-color:#F3ECCC;">0</td><td style="background-color:#F3ECCC;">2</td></tr> 
</table>

Затем, если вы поместите этот текст в строку, пакет rvest может преобразовать его в кадр данных. Например,

sample <- '<table><tr><td class="rgGroupCol">&nbsp;</td><td>Hope, Bob</td><td>7</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">7</td><td style="background-color:#F3ECCC;">7</td><td style="background-color:#F3ECCC;">0</td></tr>
                       <tr><td class="rgGroupCol">&nbsp;</td><td>Tan, Sally </td><td>76</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">76</td><td style="background-color:#F3ECCC;">23</td><td style="background-color:#F3ECCC;">53</td></tr>
                       <tr> <td class="rgGroupCol">&nbsp;</td><td>Smith, Mark</td><td>2</td><td style="background-color:#BCD4E8;">0</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#D2DEE8;"><span class="details_gridpercentage">0</span>0%</td><td style="background-color:#ECE1BA;">2</td><td style="background-color:#F3ECCC;">0</td><td style="background-color:#F3ECCC;">2</td></tr> </table>'

library(rvest)
sample1 <- minimal_html(sample)
sample1 %>%
  html_node("table") %>%
  html_table()

Это печатает таблицу

  X1          X2 X3 X4  X5  X6  X7 X8 X9 X10
1 NA   Hope, Bob  7  0 00% 00% 00%  7  7   0
2 NA  Tan, Sally 76  0 00% 00% 00% 76 23  53
3 NA Smith, Mark  2  0 00% 00% 00%  2  0   2

Он находит только 8 столбцов данных, и это все, что я вижу в HTML;Я не знаю, почему вы думаете, что должно быть 11.

Отредактировано, чтобы добавить:

Основываясь на комментарии, вы не хотите анализировать HTML,Вы хотите удалить все теги HTML. Этот код делает это:

notags <- gsub("[<][^<>]*[>]", " ", sample)

При этом используются регулярные выражения: [<] представляет один символ "<". Вероятно, вы можете использовать только < без квадратных скобок, но я всегда забываю, какие символы имеют особое значение в регулярных выражениях, поэтому это может не сработать.

Тогда [^<>] представляет любой символ, кроме "<" или ">", а * говорит «ноль или более» из них. Наконец, у нас есть заключительные > в скобках.

Так что gsub заменяет все, что похоже на тег HTML, на один пробел. Я не знаю всех правил HTML, чтобы знать, есть ли случаи, когда он будет делать что-то не так, но он должен обрабатывать большинство случаев.

Как только вы избавитесь от тегов, вы можете прочитать новыйСтрока с использованием read.table:

read.table(text = notags)

и с использованием того же sample, как указано выше, вы получите такой результат:

      V1     V2    V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
1 &nbsp;  Hope,   Bob  7  0  0 0%  0 0%   0  0%   7   7   0
2 &nbsp;   Tan, Sally 76  0  0 0%  0 0%   0  0%  76  23  53
3 &nbsp; Smith,  Mark  2  0  0 0%  0 0%   0  0%   2   0   2

Это, кажется, довольно близко к тому, что выхотеть;Я оставлю тебе последнюю часть очистки.

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