Как я могу получить href attr с этого сайта? - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь разобрать html этого веб-сайта , и когда я получаю html_nodes из предполагаемых ссылок, он получает ответ "" для всех узлов.Что я делаю не так?

texto_01 <- read_html(URL)
titulos_noticias <- texto_01 %>% html_nodes("p") %>% html_nodes("div") %>% html_nodes("ol") %>% html_nodes("li")  %>% html_nodes("a")
titulos_noticias_texto <- html_attr(titulos_noticias,"href")
titulos_noticias_texto

Оцените помощь.Ткс много, Фелипе

1 Ответ

2 голосов
/ 20 сентября 2019

Контент загружается динамически.Вы можете увидеть страницу, выполняющую поиск, а затем возвращающую набор результатов.Вам нужно имитировать фактический поисковый запрос, который вы можете найти на вкладке сети.Возвращенные результаты в формате JSON.Интересующие данные находятся в пределах r$Rows, и вы создаете URL путем объединения частей:

paste0("https://www.bcb.gov.br/estabilidadefinanceira/exibenormativo?tipo=", item$TipodoNormativoOWSCHCS,'&numero=',as.integer(item$NumeroOWSNMBR))

Вы можете использовать paste0 и map_df для обработки этой реконструкции URL в цикле по возвращенному объекту jsonот r$Rows.

Вы можете увидеть javascript, обрабатывающий этот процесс, в строке 6816 файла js https://www.bcb.gov.br/BcbModule.cdb75dd11ebbc7b56192.js, найденного на вкладке источников.

enter image description here

Обратите внимание, что js использует уже установленную переменную, найденную в строке 5609

enter image description here


R:

library(jsonlite)
library(purrr)

r = jsonlite::read_json('https://www.bcb.gov.br/api/search/app/normativos/buscanormativos?querytext=ContentType:normativo AND contentSource:normativos AND cessão&rowlimit=15&startrow=0&sortlist=Data1OWSDATE:descending&refinementfilters=Data:range(datetime(2018-09-17),datetime(2019-09-20T23:59:59))')

df <- map_df(r$Rows, function(item) {
  data.frame(title = item$title,
             url = paste0("https://www.bcb.gov.br/estabilidadefinanceira/exibenormativo?tipo=", item$TipodoNormativoOWSCHCS,'&numero=',as.integer(item$NumeroOWSNMBR)),
             stringsAsFactors=FALSE)
})

head(df)
...