使用rvest批量爬取网页报错:arguments imply differing number of rows
解决rvest爬取SAGE期刊时的行数不匹配错误
你遇到的这个报错Error in data.frame(...) : arguments imply differing number of rows: 1, 6, 65,核心原因很明确:你提取的三个字段行数完全不匹配!
咱们拆解下选择器对应的内容:
.journalNavTitle是当期期刊的整体标题(比如卷号+期号),每个页面只有1个;.hlFld-Title是单篇文章的标题,每个页面有N个(比如你这里的6或65);.entryAuthor是对应文章的作者,数量和标题保持一致。
直接把这三个字段塞进data.frame时,R会因为列的行数不统一而抛出错误。
修改后的代码方案
我们只需要把单个的IssueID重复对应到每一篇文章的行上,让所有列的行数保持一致就行,这里用rep()函数实现重复逻辑:
library(xml2) library(rvest) library(purrr) # 注意你原来的变量名打错了,是url不是ulr哦 url_base <- "https://journals.sagepub.com/toc/jina/33/%d" map_df(1:4, function(i){ page <- read_html(sprintf(url_base, i)) # 分别提取三个字段,先拿到各自的内容 issue_id <- html_text(html_nodes(page, ".journalNavTitle")) headings <- html_text(html_nodes(page, ".hlFld-Title")) authors <- html_text(html_nodes(page, ".entryAuthor")) # 把单个IssueID重复,次数等于文章数量,确保列行数一致 data.frame( IssueID = rep(issue_id, length(headings)), Heading = headings, Author = authors, stringsAsFactors = FALSE # 建议加上,避免字符型数据自动转成因子 ) }) -> SageJournals
额外优化建议
- 修正了你原来的变量名错误(
ulr_base→url_base),避免后续出现找不到变量的问题; - 加入
stringsAsFactors = FALSE可以防止字符型数据被自动转成因子,后续数据处理更灵活; - 如果担心某个页面没有文章(即
headings长度为0),可以加个判断跳过空页面:if(length(headings) == 0) return(NULL)
这样修改后,每篇文章都会对应到当期的IssueID,所有列的行数完全匹配,就不会再报错啦!
内容的提问来源于stack exchange,提问作者eagle_ey3s
相关产品推荐
相关产品推荐

