【发布时间】:2019-01-20 01:15:54
【问题描述】:
我在一个网站上使用了以下内容,它返回了一个完美的结果:
寻找关键字:Emaar 粘贴在查询末尾:
library(httr)
library(jsonlite)
query<-"https://www.googleapis.com/customsearch/v1?key=AIzaSyA0KdZHRkAjmoxKL14eEXp2vnI4Yg_po38&cx=006431301429107149113:as7yqcm2qc8&q=Emaar"
result11 <- content(GET(query))
print(result11)
result11_JSON <- toJSON(result11)
result11_JSON <- fromJSON(result11_JSON)
result11_df <- as.data.frame(result11_JSON)
现在我想在包含关键词的 data.frame 上应用相同的函数:
所以我做了以下测试 .csv 文件:
Company Name
[1] ADES International Holding Ltd
[2] Emirates REIT (CEIC) Limited
[3] POLARCUS LIMITED
称之为测试网站提取.csv
使用的代码:
test_companies <- read.csv("... \\Testing Website Extraction.csv")
#removing space and adding "+" sign then pasting query before it (query already has my unique google key and search engine ID
test_companies$plus <- gsub(" ", "+", test_companies$Company.Name)
query <- "https://www.googleapis.com/customsearch/v1?key=AIzaSyCmD6FRaonSmZWrjwX6JJgYMfDSwlR1z0Y&cx=006431301429107149113:as7yqcm2qc8&q="
test_companies$plus <- paste0(query, test_companies$plus)
a <- test_companies$plus
length(a)
function_webs_search <- function(web_search) {content(GET(web_search))}
result <- lapply(as.character(a), function_webs_search)
此处的结果显示长度为 3 的列表(3 个搜索词)和每个词中的子列表,其中包含:url (list[2])、query (list[2])、... items (list[10])这些对于每个搜索词都是相同的(分别相同的长度),我的问题是应用代码的其余部分
#when i run:
result_JSON <- toJSON(result)
result_JSON <- as.list(fromJSON(result_JSON))
我得到一个包含 6 个子列表的列表
并将其放入一个整洁的数据框中,结果被证明是困难的,结果彼此列在下面(而不是单独列出)
还请注意,我尝试从包含 3 个单独列表的“结果”列表中获取每个单独的列表,但如果我有更长的关键字列表,则需要大量的体力劳动
预期的最终结果应包括 37 个变量的 30 个观察值(对于每个搜索词,37 个变量的 10 个观察值,并且都在彼此之下。
我尝试失败的事情:
These work to flatten the list:
#do.call(c , result)
#all.equal(listofvectors, res, check.attributes = FALSE)
#unlist(result, recursive = FALSE)
# for (i in 1:length(result)) {listofvectors <- c(listofvectors, result[[i]])}
#rbind()
#rbind.fill()
即使在展平之后,我也不知道如何将它们组织成一个整洁的最终输出,以供非 R 用户与之交互。
我们将不胜感激任何帮助,
我在这里,以防我的问题有什么不清楚的地方,
总是很高兴了解更多关于 R 的信息,所以请多多包涵,因为我刚刚开始赶上。
一切顺利,提前致谢!
【问题讨论】:
-
url 调用的内容很多,在转换为
data.frame时,很多项目被回收(回收较短的长度以匹配较长的长度)。不确定您要通过有效的fromJSON(toJSON(content(GET(ur))))实现什么。由于回收data.frame 对象会有很多不正确的信息。如果你想从查询输出中提取特定的东西,你应该多分析一下结构。 -
您好,我正在尝试提取每个公司的前 10 个结果,然后将它们全部合并到一个数据框下(每个公司 10 个和 37 个变量的 30 个观察值)
-
请将问题简化为minimal reproducible example。特别是,如果查询返回预期结果,则不是问题,可以用硬编码数据替换。此外,如果 JSON 解码不是问题,也可以将其删除。