#r #selenium #xpath #rselenium
#r #селен #xpath #rselenium
Вопрос:
Как я могу перейти по ссылке, щелкнуть ссылку и извлечь оттуда данные?
Я пробовал этот код, но безуспешно.
library("RSelenium")
startServer()
mybrowser <- remoteDriver()
mybrowser$open()
mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
# click 'Quarterly' button...
Что-то вроде того, что близко, это.
Сейчас тестирую обновленный код; результаты ниже.
> rm(list=ls())
>
>
> library("RSelenium")
> startServer()
Error: startServer is now defunct. Users in future can find the function in
file.path(find.package("RSelenium"), "examples/serverUtils"). The
recommended way to run a selenium server is via Docker. Alternatively
see the RSelenium::rsDriver function.
> mybrowser <- remoteDriver()
> mybrowser$open()
[1] "Connecting to remote server"
Error in checkError(res) :
Undefined error in httr call. httr output: Failed to connect to localhost port 4444: Connection refused
> mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
> mybrowser$findElement("xpath", "//button[text() = '
OK
']")$clickElement()
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
> mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
>
Ответ №1:
Я думаю, что это может быть случай, когда вы сталкиваетесь с этим на веб-сайте.
Вы можете просто «нажать» кнопку OK через:
mybrowser$findElement("xpath", "//button[text() = '
OK
']")$clickElement()
И затем вы можете нажать «ежеквартально» через:
mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
(Подсказка: для выявления ошибок такого рода может быть полезно проверить текущее состояние браузера через: remDr$screenshot(TRUE)
.)
Я не уверен, что он актуален, но определенные данные также доступны через API, вы могли бы проверить пакет quantmod, чтобы получить более легкий доступ.
Полный пример:
library("RSelenium")
startServer()
mybrowser <- remoteDriver()
mybrowser$open()
mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
mybrowser$findElement("xpath", "//button[text() = '
OK
']")$clickElement()
mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
Комментарии:
1. Я только что обновил свой первоначальный вопрос опубликованным вами кодом. Я получаю эту ошибку: Ошибка: попытка применить нефункциональные Какие-либо мысли? Да, возможно, API сработал бы. Я, конечно, могу разобраться в этом. Мне было любопытно узнать о опции веб-синтаксического анализа. Хотя, возможно, это слишком громоздко. Если у вас есть какие-либо дополнительные идеи, я определенно был бы рад услышать о них.
2. на всякий случай, мой код использует ваш элемент «mybrowser», который является частью вашей попытки rselenium, а не самой первой попытки. Не могли бы вы это перепроверить?
3. Я вставил туда ‘mybrowser’ и получаю эту ошибку: Ошибка в checkError (res): неопределенная ошибка в вызове httr. вывод httr: длина (url) == 1 не соответствует ДЕЙСТВИТЕЛЬНОСТИ
4. 1. Не могли бы вы, пожалуйста, убедиться, что вы можете перейти на страницу, указанную вами через
mybrowser$navigate("https://......")
2. Не могли бы вы указать, какая команда выдает ошибку, о которой вы упомянули 3. Не могли бы вы, пожалуйста, запустить код «Полного примера» в моем отредактированном ответе. Возможно, вы изменили код и удалили пробелы и разрывы строк из"//button[text() = ' OK
части. Спасибо5. Хорошо, тогда ваш удаленный драйвер даже не
$open()
. Это своего рода новый вопрос. Сложно отлаживать это через Интернет. Смешно сказать, но вы пробовали перезапуск? 🙂