从xpath返回时R中的奇怪列表

时间:2014-12-19 01:59:35

标签: html r list xpath vector

我通常使用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,要么就是我应该对列表有更多了解。我无法找到这个特例的任何例子。提前致谢!

2 个答案:

答案 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"