我有一个Excel文件,其中包含某些需要通过R在google中搜索的关键字。 要创建的输出是一个数据框,其中包含以下变量:
关键字;位置(URL在搜索结果中的位置);标题(第i个搜索结果的标题);文本(该搜索结果中的文本); URL;域 关键字和输出示例在下面的链接中给出:
https://drive.google.com/file/d/1AM3d5Hbf5nBpbRG1ydnZM7ZG2AdUyy-6/view?usp=sharing
(第1页包含关键字,第2页包含示例输出)
我试图创建类似的输出,但是似乎有一个错误。 代码:
# Web Scraping in R
library(XML)
library(RCurl)
library(dplyr)
library(rvest)
library(urltools)
library(htm2txt)
library(readxl)
data <- read_excel(file.choose()) # Importing the data
output <- data.frame(matrix(ncol=6,nrow=0))
colnames(output) <- c("Name","Position","Title","Text","URL","Domain")
for (i in 1:nrow(data)) {
search.term <- data[i,1]
getGoogleURL <- function(search.term, domain = '.com', quotes=TRUE)
{
search.term <- gsub(' ', '%20', search.term) # Cleaning the Search Term
if(quotes) search.term <- paste('%22', search.term, '%22', sep='')
getGoogleURL <- paste('http://www.google', domain, '/search?q=',
search.term, sep='')
}
quotes <- "False"
search.url <- getGoogleURL(search.term=search.term, quotes=quotes)
page <- read_html(search.url)
links <- page %>% html_nodes("a") %>% html_attr("href")
link <- links[startsWith(links, "/url?q=")]
link <- sub("^/url\\?q\\=(.*?)\\&sa.*$","\\1", link)
for (j in 1:length(link)) {
page1 <- read_html(link[j])
name <- data[i,1]
position <- j
title <- page1 %>% html_node("title") %>% html_text()
text <- gettxt(link[j])
url <- link[j]
domain <- suffix_extract(domain(link[j]))$host
vect <- c(name,position,title,text,url,domain)
output <- rbind(output,vect)
}
}
显示的错误是:
Error in match.names(clabs, nmi) : names do not match previous names
请帮助,我是R的新手。
答案 0 :(得分:1)
当列的排列不完全时,该错误来自rbind
。例如,如果缺少一列或多余的列。在这种情况下,可能是因为您的vect
变量之一为空/ NULL
或长度超过1。
rbind(data.frame(a=1,b=2), data.frame(b=3))
# Error in rbind(deparse.level, ...) :
# numbers of columns of arguments do not match
由于迭代地将行添加到框架会变得很昂贵(每次甚至添加一行也都会生成框架的完整副本,因此效率非常低),因此通常最好将其追加到list
并转换为一帧通话。
out <- list()
for (i in seq_len(nrow(data))) {
# ...
for (j in seq_along(link)) {
# ...
vect <- c(name, position, title, text, url, domain)
stopifnot(length(vect) == 6L)
out <- c(out, list(vect))
}
}
outout <- do.call(rbind.data.frame, out)
colnames(output) <- c("Name", "Position", "Title", "Text", "URL", "Domain")
(实际上,代替法令stopifnot
的人可能会将URL和检索到的数据记录到不同的list
中,以进行取证。或者找到丢失的元素并NA
,然后再添加到无论哪种方式,stopifnot
都打算在这里作为占位符,用于与您和您的流程相关的内容。)