我试图在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;
但这是不可靠的。有什么想法吗?
答案 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"