使用 rvest 抓取可折叠表的问题
Posted
技术标签:
【中文标题】使用 rvest 抓取可折叠表的问题【英文标题】:Issue scraping a collapsible table using rvest 【发布时间】:2021-09-19 02:34:17 【问题描述】:我正在尝试从名为 APIS 的网站的多个可折叠表格中抓取信息。 我试图收集的一个例子是这里http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next
理想情况下,我希望能够让下拉标题后跟下面的信息,但在使用 rvest 时,我似乎无法从 html 中选择正确的部分。
我对 R 相当陌生,这是我通过观看一些关于抓取的视频所得到的:
link = "http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next"
page = read_html(link)
name = page %>% html_nodes(".tab-tables :nth-child(1)") %>% html_text()
“名称”值显示“字符(空)”
这可能是因为我是新手,并且有一个非常明显的答案,但我们将不胜感激
【问题讨论】:
【参考方案1】:每个选项卡的数据来自您可以在按 F5 刷新页面时在浏览器网络选项卡中找到的其他请求。例如,营养素信息来自:
http://www.apis.ac.uk/sites/default/files/AJAX/srcl_2019/apis_tab_nnut.php?ajax=true&site=1001814&BH=&populateBH=true
您可以更一般地认为是:
scheme='http'
netloc='www.apis.ac.uk'
path='/sites/default/files/AJAX/srcl_2019/apis_tab_nnut.php'
params=''
query='ajax=true&site=1001814&BH=&populateBH=true'
fragment=''
因此,您可以向您在网络选项卡中看到的那些网址发出请求。
如果您想动态确定这些 url,然后像您一样向登录页面发出请求,然后从响应文本中正则表达式输出 url 的路径 (见上文)。这可以使用以下模式url: "(\\/sites\\/default\\/files\\/.*?)"
来完成。
然后您需要将协议 + 域(scheme 和 netloc)添加到基于着陆页协议和域的返回匹配项中。
还有一些额外的查询字符串参数,位于?
之后,如果从响应文本中重构 url,也可以动态检索这些参数。您可以在页面源代码中看到这些:
您可能希望为 Ajax 请求提取每个数据参数规范,例如使用data:\\s\\((.*?)\\),
然后有一个自定义函数,它将匹配项转换为所需的查询字符串后缀,以添加到先前检索到的 url。
类似于以下内容:
library(rvest)
library(magrittr)
library(stringr)
get_query_string <- function(match, site_code)
string <- paste0(
"?",
gsub("siteCode", site_code, gsub('["]', "", gsub(",\\s+", "&", gsub(":\\s+", "=", match))))
)
return(string)
link <- "http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next"
page <- read_html(link) %>% toString()
links <- paste0("http://www.apis.ac.uk", stringr::str_match_all(page, 'url: "(\\/sites\\/default\\/files\\/.*?)"')[[1]][, 2])
params <- stringr::str_match_all(page, "data:\\s\\((.*?)\\),")[[1]][, 2]
site_code <- stringr::str_match_all(page, 'var siteCode = "(.*?)"')[[1]][, 2]
params <- lapply(params, get_query_string, site_code)
urls <- paste0(links, params)
【讨论】:
以上是关于使用 rvest 抓取可折叠表的问题的主要内容,如果未能解决你的问题,请参考以下文章