RSelenium嵌套节点数据提取:Google Scholar PDF链接获取问题
解决Google Scholar爬取PDF链接行数不匹配的问题
核心问题在于直接提取所有.gs_or_ggsm a节点会得到所有PDF链接,但每篇文献的PDF数量不一致,导致结果行数和文献总数不匹配。正确做法是按单篇文献的容器节点逐个处理,对每篇文献单独提取第一个有效PDF链接:
修改后的PDF提取逻辑
在extract_data函数中,替换原PDF提取代码为以下内容:
# 定位每一篇文献的独立容器节点 gs_items <- page %>% html_nodes(".gs_or") # 遍历每个容器,提取第一个有效PDF链接 PDFs <- map_chr(gs_items, function(item) { # 提取当前文献下的所有PDF链接候选 links <- item %>% html_nodes(".gs_or_ggsm a") %>% html_attr("href") # 过滤出有效的外部PDF链接(排除Google Scholar内部跳转链接) valid_links <- links[startsWith(links, "https://") & !startsWith(links, "/scholar?")] # 返回第一个有效链接,无则返回NA if(length(valid_links) > 0) valid_links[1] else NA_character_ })
完整修改后的extract_data函数
extract_data <- function(page_source) { page <- read_html(page_source) titles <- page %>% html_nodes(".gs_rt") %>% html_text() authors <- page %>% html_nodes(".gs_a") %>% html_text() years <- str_extract(authors, "\\d{4}") authors <- str_replace(authors, "\\d{4}", "") urls <- page %>% html_nodes(".gs_rt a") %>% html_attr("href") # 新增的PDF提取逻辑 gs_items <- page %>% html_nodes(".gs_or") PDFs <- map_chr(gs_items, function(item) { links <- item %>% html_nodes(".gs_or_ggsm a") %>% html_attr("href") valid_links <- links[startsWith(links, "https://") & !startsWith(links, "/scholar?")] if(length(valid_links) > 0) valid_links[1] else NA_character_ }) data.frame(Title_name = titles, Author_Names = authors, Year_Publication = years, Title_URL = urls, PDF_Link = PDFs) }
逻辑说明
- 通过
.gs_or定位每篇文献的独立容器,确保遍历次数和文献数量完全一致 - 对每个容器内部的PDF链接单独过滤、提取,只保留第一个符合要求的外部链接
- 无有效链接时自动填充
NA,最终PDFs向量的长度和titles、authors等字段完全匹配,解决行数不一致问题
内容的提问来源于stack exchange,提问作者Camilo
相关产品推荐
相关产品推荐

