рекурсивный аргумент xmlValue в пакете XML в R - PullRequest
0 голосов
/ 27 октября 2019

В функции xmlValue в пакете XML аргумент recursive определяется как: «логическое значение, указывающее, обрабатывать ли все подузлы (ИСТИНА) или только текстовые узлы в узле x. "Но в проекте по поиску в сети, который я пытаюсь сделать, похоже, это не сработает. Вот упрощенная версия HTML:

myhtml <- "<html><head>
<title> </title>
</head>
<body><table><tbody>
<tr><th>Presidents</th>&#13;
<td>George W. Bush<br/>Republican</td>&#13;
<td><strong>Barack H. Obama<br/>Democratic</strong></td>&#13;
<td>Donald J. Trump<br/>Republican</td>&#13;
</tr></tbody></table></body></html>"

Обратите внимание, что в узлах <td> существует <br/> между именем человека и партией. Я хочу получить доступ к имени и группе по отдельности в R. Поэтому я не использую readHTMLTable.

library(XML)
doc1 <- htmlParse(myhtml, asText = TRUE, ignoreBlanks = FALSE, trim = FALSE, encoding="UTF-8")
doc2 <- xmlRoot(doc1)
mynodes <- getNodeSet(doc2, ".//td")
names(mynodes[[1]])

names из mynodes [[1]] равны "text" "br" "text".

party <- xmlValue(mynodes[[1]][[3]], recursive=TRUE)

дает "Republican" (как и ожидалось). Но

party <- xmlValue(mynodes[[1]][[3]], recursive=FALSE)

дает character(0). У меня вопрос почему. Имя тега mynodes [[1]] [[3]] равно "text", поэтому xmlValue не должен его обрабатывать независимо от recursive?

Другая трудность, с которой я сталкиваюсь на этой веб-странице, заключается в том, что некоторые записи в таблице имеют теги <strong>, например, вторую ячейку в моем примере выше (Барак Обама). Это означает, что для доступа к именам партий (в данном примере «республиканцы» и «демократы») я должен применить xmlValue к:

mynodes[[1]][[3]]
mynodes[[2]][[1]][[3]]
mynodes[[3]][[3]]

Есть ли простой способ игнорировать эти теги <strong>, еслиприсутствует или мне нужно проверить их и получить доступ к mynodes[[k]][[3]] или mynodes[[k]][[1]][[3]] соответственно? Или есть более простой способ получить доступ к тексту в узле <td> 1035 * после <br/>?

...