解析在R中的元素内

时间:2015-03-26 13:52:09

标签: xml r xpath

我试图在R中解析一些相当不幸写的html,但我遇到了一些障碍。

表结构是这样的,我需要在单独的字段中的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根据
分割字符串     &#34;?&lt; = [a-z] | \))(?= [A-Z]&#34;

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

3 个答案:

答案 0 :(得分:2)

您可以使用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" 

答案 1 :(得分:2)

这个怎么样

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)
)

返回

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

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

请注意,每个td都会转换为列表中的元素,列表由长度为2的向量组成。

答案 2 :(得分:0)

你可以在

的血脉中尝试一些东西
matrix(
  xpathSApply(doc, '//td//text()', xmlValue), 
  ncol = 2, byrow = T)
#      [,1]                                 [,2]        
# [1,] "Frederick Henry    Bay,  Australia" "Ansett ANA"