我通常使用c ++并且是R的新手。我不太清楚如何处理我从xpath返回内容时获得的数据类型。
我相信这是一个清单。我想将它转换为矢量。我知道它是否是这样的普通列表:
> testlist = list(1,2,3,4,5)
> testlist
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 5
我可以unlist
然后回来:
> testvec = unlist(testlist)
> testvec
[1] 1 2 3 4 5
>
然而,我的问题是当我使用xpath时,我会得到类似的东西:
test
[[1]]
ABT
[[2]]
ABBV
[[3]]
ACE
[[4]]
ACN
[[5]]
ACT
如果我尝试unlist
,我会得到:
> unlist(test)
[[1]]
ABT
[[2]]
ABBV
[[3]]
ACE
[[4]]
ACN
[[5]]
ACT
[[6]]
ADBE
所以我猜这是一个列表,但它是一个没有索引的字符列表?我无法将其写入文件,或者我得到:
> write(unlist(test), file = "test.txt")
Error in cat(list(...), file, sep, fill, labels, append) :
argument 1 (type 'list') cannot be handled by 'cat'
即使我能做到:
> write(unlist(testlist), file = "testlist.txt")
好的。我似乎无法找到有关如何转换这个奇怪列表的说明。我甚至不知道如何重现某些东西。
为了展示我正在做的事情,我会告诉你我从我的道路上得到了什么。
> library(XML)
> wikiurl = "http://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
> urlcontent = htmlTreeParse(wikiurl, useInternal = TRUE)
> myxpath = "//div[@id='content' and @class='mw-body']/div[@id='bodyContent']/div[@id='mw-content-text']/table/tr[2]/td[1]/a/text()"
> returnval = xpathSApply(urlcontent, myxpath)
> returnval
[[1]]
ABT
再一次,我得到了一个没有索引的char的奇怪列表。不应该看起来像:
> reutrnval
[[1]]
[1] ABT
所以要么我没有以正确的方式做xpath,要么就是我应该对列表有更多了解。我无法找到这个特例的任何例子。提前致谢!
答案 0 :(得分:1)
您无法通过打印到控制台的方式来判断对象是什么。您所看到的是在该对象上调用print()
的结果。如果您想知道所看到的对象类型,请尝试查看class()
class(returnval[[1]])
# [1] "XMLInternalTextNode" "XMLInternalNode" "XMLAbstractNode"
所以你得到的是来自库的XML节点表示。这不是一种简单的数据类型,因此您无法将其折叠为unlist()
的向量,就像使用原子类型一样。如果您确实要从文本节点中提取文本,通常会在该节点上调用xmlValue
。您可以将其添加到xpathSApply。
returnval = xpathSApply(urlcontent, myxpath, xmlValue)
returnval
# [1] "ABT"
class(returnval)
# [1] "character"
现在你得到的是简单的角色向量。
答案 1 :(得分:1)
如果你想抓住第一栏,我会使用rvest
:
library(rvest)
wikiurl <- "http://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
myxpath <- "//div[@id='content' and @class='mw-body']/div[@id='bodyContent']/div[@id='mw-content-text']/table/tr/td[1]/a/text()"
pg <- html(wikiurl)
pg %>% html_nodes(xpath=myxpath) %>% html_text()
## [1] "ABT" "ABBV" "ACE" "ACN" "ACT" "ADBE" "ADT" "AES" "AET"
## [10] "AFL" "AMG" "A" "GAS" "APD" "ARG" "AKAM" "AA" "ALXN"
## ...
## [487] "WFM" "WMB" "WIN" "WEC" "WYN" "WYNN" "XEL" "XRX" "XLNX"
## [496] "XL" "XYL" "YHOO" "YUM" "ZMH" "ZION" "ZTS"