使用R语言rvest包获取谷歌搜索首个非广告链接的报错排查
修复谷歌搜索首个非广告链接获取失败的问题
问题根源
你代码里的html_nodes(".g:not(.g .adsbygoogle)")写法错误,CSS的:not()伪类内部不能直接嵌套这种后代选择器写法,rvest依赖的CSS解析器无法识别,导致抛出Expected ')', got .的语法错误。
修复方案
- 修正CSS选择器:使用
:has()伪类筛选不包含广告元素的.g容器,这是判断父元素是否存在特定子元素的标准写法。 - 处理中转链接:谷歌搜索结果的
href会带有/url?q=的跳转前缀,需要提取其中的真实链接地址,仅用URLdecode()无法完成这一步。
完整修复代码
library(rvest) library(stringr) url <- "https://www.google.com/search?q=Kendrick+Lamar+aoty" search_page <- read_html(url) first_link <- search_page %>% # 筛选不包含.adsbygoogle子元素的.g容器 html_nodes(".g:not(:has(.adsbygoogle))") %>% html_node("a") %>% html_attr("href") %>% # 提取/url?q=后的真实链接,去除后续&参数 str_extract("(?<=/url\\?q=)[^&]+") %>% URLdecode() print(first_link)
关键说明
- 替换后的选择器
.g:not(:has(.adsbygoogle))精准筛选出不含广告模块的搜索结果块,避免了解析语法错误。 - 通过
str_extract提取真实链接,解决了谷歌搜索链接的中转跳转问题,最终能得到预期的https://www.albumoftheyear.org/artist/1881-kendrick-lamar/。
内容的提问来源于stack exchange,提问作者J.Q
相关产品推荐
相关产品推荐

