使用RSelenium访问含引号URL的问题:如何直接加载正确内容
问题:RSelenium访问含引号的SEC Edgar搜索URL直接加载失败,仅先访问错误URL再跳转可行
在使用RSelenium访问包含引号的SEC Edgar搜索URL时,直接访问目标页面会出现内容加载失败的情况,但先访问一个错误格式的URL再导航到正确URL,内容就能成功加载(仅版本5代码有效)。需要找到无需先访问错误URL,直接访问正确页面的方法。
加载Selenium初始化代码
rD <- RSelenium::rsDriver(browser = "chrome", port = 4444L, chromever = NULL, verbose = FALSE) remDr <- rD[["client"]]
已尝试的失败/部分成功方案
版本1 - 常规直接访问(内容加载失败)
url <- "https://www.sec.gov/edgar/search/#/q=%2522apple%2522&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31" remDr$navigate(url)
版本2 - 使用URLencode处理后访问(内容加载失败)
url <- "https://www.sec.gov/edgar/search/#/q=%2522apple%2522&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31" url <- URLencode(url, reserved = TRUE) remDr$navigate(url)
版本3 - 转义引号后访问(内容加载失败)
url <- 'https://www.sec.gov/edgar/search/#/q=\"apple\"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31' remDr$navigate(url)
版本4 - 双反斜杠转义引号(部分成功,内容错误)
url <- 'https://www.sec.gov/edgar/search/#/q=\\\"apple\\\"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31' remDr$navigate(url)
注:此版本加载的内容存在错误——点击数据时文档中的"apple"不会高亮,且搜索表单包含多余反斜杠。
版本5 - 先访问错误URL再跳转正确URL(成功)
# step 1 加载错误内容 url <- 'https://www.sec.gov/edgar/search/#/q=\\\"apple\\\"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31' remDr$navigate(url) # step 2 跳转正确URL,内容加载正常 url <- 'https://www.sec.gov/edgar/search/#/q="apple"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31' remDr$navigate(url)
注:此版本中点击文档时"apple"会高亮,搜索表单仅包含引号,内容正常。
版本6 - 使用JavaScript跳转(内容加载失败)
url <- 'https://www.sec.gov/edgar/search/#/q="apple"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31' remDr$executeScript(paste("window.location.href='", url, "';", sep=""))
解决方案:模拟手动搜索流程(无需先访问错误URL)
直接访问带参数的URL失败,大概率是因为页面的JavaScript尚未完成初始化就解析了URL中的hash参数,导致无法正确处理带引号的查询条件。可以通过模拟手动搜索的方式绕过这个问题:
# 1. 先访问SEC Edgar搜索首页,等待页面完全加载 remDr$navigate("https://www.sec.gov/edgar/search/") # 等待搜索框加载完成(可根据实际情况调整等待时间) Sys.sleep(3) # 2. 定位搜索输入框,输入带引号的关键词 search_box <- remDr$findElement(using = "css selector", value = "#search-term") search_box$sendKeysToElement(list('"apple"')) # 3. 设置日期范围为自定义 date_range_dropdown <- remDr$findElement(using = "css selector", value = "#date-range-select") date_range_dropdown$click() custom_option <- remDr$findElement(using = "css selector", value = "#date-range-select option[value='custom']") custom_option$click() # 4. 填写开始和结束日期 start_date_input <- remDr$findElement(using = "css selector", value = "#start-date") start_date_input$clearElement() start_date_input$sendKeysToElement(list("2017-01-01")) end_date_input <- remDr$findElement(using = "css selector", value = "#end-date") end_date_input$clearElement() end_date_input$sendKeysToElement(list("2017-12-31")) # 5. 提交搜索 search_button <- remDr$findElement(using = "css selector", value = "#search-button") search_button$click() # 等待搜索结果加载完成 Sys.sleep(5)
替代方案:先加载首页再修改URL Hash
如果希望继续使用URL参数的方式,可以先加载首页,等页面JS初始化完成后,再修改location.hash来触发搜索:
# 1. 访问搜索首页,等待初始化完成 remDr$navigate("https://www.sec.gov/edgar/search/") Sys.sleep(3) # 2. 使用JavaScript设置正确的hash参数 correct_hash <- "#/q=\"apple\"&dateRange=custom&startdt=2017-01-01&enddt=2017-12-31" remDr$executeScript(paste0("window.location.hash = '", correct_hash, "';")) # 等待结果加载 Sys.sleep(5)
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

