В функции xmlValue
в пакете XML
аргумент recursive
определяется как: «логическое значение, указывающее, обрабатывать ли все подузлы (ИСТИНА) или только текстовые узлы в узле x. "Но в проекте по поиску в сети, который я пытаюсь сделать, похоже, это не сработает. Вот упрощенная версия HTML:
myhtml <- "<html><head>
<title> </title>
</head>
<body><table><tbody>
<tr><th>Presidents</th>
<td>George W. Bush<br/>Republican</td>
<td><strong>Barack H. Obama<br/>Democratic</strong></td>
<td>Donald J. Trump<br/>Republican</td>
</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/>
?