在 R 中的 <td> 元素中解析 <br>

Parsing <br> within a <td> element in R

我正在尝试解析一些用 R 编写的相当不幸的 html,但我 运行 遇到了一些障碍。

table 结构是这样的,我需要在不同字段中的 2 个字符串仅由
标记分隔。

<td  align="left"valign="top"><font face="Arial" size="2">Frederick Henry    Bay,  Australia<br>Ansett ANA

我需要将位置和操作员分开,但似乎无法找到一种方法来做到这一点而不变得非常 hacky。我认为首先必须有一种方法可以正确解析 HTML 。

到目前为止,我一直在解析如下

# Read and parse HTML file
html.raw = htmlTreeParse(url,useInternal = TRUE)

# Extract HTML.
html.parse = unlist(xpathApply(html.raw, '//td', xmlValue))

但这会删除 br 标签,并迫使我使用 str_split 根据
拆分字符串 "?<=[a-z]|\))(?=[A-Z]"

但这并不可靠。有什么想法吗?

您可以使用getChildrenStrings函数:

appHtml <- '<td  align="left"valign="top"><font face="Arial" size="2">Frederick Henry    Bay,  Australia<br>Ansett ANA'
library(XML)
doc <- htmlParse(appHtml)
res <- doc["//td/font", fun = getChildrenStrings]

> res[[1]]
                                text                                   br                                 text 
"Frederick Henry    Bay,  Australia"                                   ""                         "Ansett ANA" 

> lapply(res, function(x) x[names(x) == "text"])
[[1]]
                                text                                 text 
"Frederick Henry    Bay,  Australia"                         "Ansett ANA" 

这个怎么样

test<-'<html><td  align="left"valign="top"><font face="Arial" size="2">Frederick Henry    Bay,  Australia<br>Ansett ANA</td><td  align="left"valign="top"><font face="Arial" size="2">Liverpool, England<br>Queen BRB</td></html>'

library(XML)
html.raw = htmlTreeParse(test,useInternal = TRUE)
xpathApply(html.raw, '//td', function(x)
    xpathSApply(x,".//text()", xmlValue)
)

哪个returns

[[1]]
[1] "Frederick Henry    Bay,  Australia" "Ansett ANA"                        

[[2]]
[1] "Liverpool, England" "Queen BRB"   

注意每个td都变成了列表中的一个元素,列表由长度为2的向量组成。

你可以试试

matrix(
  xpathSApply(doc, '//td//text()', xmlValue), 
  ncol = 2, byrow = T)
#      [,1]                                 [,2]        
# [1,] "Frederick Henry    Bay,  Australia" "Ansett ANA"