在 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"
我正在尝试解析一些用 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"