Моя конечная цель состоит в том, чтобы удалить из Интернета страницу Таблица Озадаченная пинта для Montreal
.
Я думаю, что мне нужно динамически удалить ( например, использовать RSelenium
), поскольку интересующая меня таблица представляет собой JavaScript iframe
- часть веб-страницы, которая отображает контент, независимыйего контейнера.
Некоторые предположили, что очистка непосредственно от источника этих iframes
- это путь.Я использовал инструмент веб-разработчика Inspector
в своем браузере firefox
, чтобы найти src=
, который выглядит как Google Sheets
.
Во-первых, используйте robots.txt
, чтобы убедиться, что нам разрешено очищать его от Google Sheets
:
library(robotstxt)
paths_allowed("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")
Теперь, когда я знаю, что у меня есть разрешение, я попробовал пакет RCurl
.Получить первую страницу очень просто:
library(RCurl)
sheet <- getForm("https://docs.google.com/spreadsheet/pub", hl = "en_US", key = "1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U", output = "csv", .opts = list(followlocation = TRUE, verbose = TRUE, ssl.verifypeer = FALSE))
df <- read.csv(textConnection(sheet))
head(df)
Однако, когда вы нажимаете на любую из других Month/Year
ссылок на этом Google Sheet
gid=
изменения URL-адреса.Например, на октябрь 2018 года это теперь:
https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=1367583807
Я не уверен, что можно очистить widget
с RCurl
?Если бы я хотел услышать как.
Похоже, мне, скорее всего, понадобится RSelenium
, чтобы сделать это.
library(RSelenium)
# connect to a running server
remDr <- remoteDriver(
remoteServerAddr = "192.168.99.100",
port = 4445L
)
remDr$open()
# navigate to the site of interest
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")
Моя проблема пытается получитьHTML
для таблицы на этой странице, следующее было предложено для SO , но не работает для меня (он не возвращает ожидаемый результат, только Month/Year
метаданные из ссылок / элементов)?
library(XML)
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)
Я считаю, что мне нужно перейти к внутренней рамке, но не знаете, как это сделать?Например, при поиске тега CSS для этой таблицы с SelectorGadget
в chrome
, я получаю предупреждение о том, что это iframe, и чтобы иметь возможность выбирать его, мне нужно щелкнуть ссылку.
Когда я использую эту ссылку с readHTMLTable()
, я получаю необходимую информацию:
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pubhtml/sheet?headers=false&gid=203220308")
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)
Это создает проблему, так как мне нужно использовать RSelenium
для навигации по различным страницам / таблицам предыдущей ссылки (виджет iframe
):
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")
Для навигации по различным страницам / таблицам я использую SelectorGadget , чтобы найти CSS
теги
# find all elements/links
webElems <- remDr$findElements(using = "css", ".switcherItem")
# Select the first link (October 2018)
webElem_01 <- webElems[[1]]
Затем с помощью TightVNC viewer Я подтвердил, что я былвыделив нужный элемент, затем «щелкните» элемент (в данном случае ссылка October 2018
).
webElem_01$highlightElement()
webElem_01$clickElement()
Так как яЯ вижу, что страница изменилась на TightVNC
Я предполагаю, что здесь больше не требуется никаких шагов, прежде чем захватывать / очищать, но, как уже упоминалось, мне нужен способ программного перехода к внутреннему iframe
каждой из этих страниц.
ОБНОВЛЕНИЕ
Хорошо, я понял, как перейти к внутреннему фрейму с помощью команды remDr$switchToFrame()
, но я не могуКажется, выясняется, как вернуться к внешнему фрейму, чтобы «щелкнуть» по следующей ссылке и повторить процесс.Моя нынешняя хакерская попытка будет включать в себя возвращение на главную страницу и повторение этого процесса много раз:
# navigate to the main page
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156")
# look for table
tableElem <- remDr$findElement(using = "id", "pageswitcher-content")
# switch to table
remDr$switchToFrame(tableElem)
# parse html
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)
# how do I switch back to the outer frame?
# the remDr$goBack() command doesn't seem to do this
# workaround is to navigate back to the main page then navigate back to the second page and repeat process
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156")
webElems <- remDr$findElements(using = "css", ".switcherItem")
webElem_01 <- webElems[[1]]
webElem_01$clickElement()
tableElem <- remDr$findElement(using = "id", "pageswitcher-content")
# switch to table
remDr$switchToFrame(tableElem)
# parse html
doc2 <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc2)