#html #r #xml #web-scraping #rvest
#HTML #r #xml #очистка веб-страниц #rvest
Вопрос:
Это веб-сайт, на котором я создаю проекты ppp
Я хочу использовать xpath для выбора узла, как показано ниже
xpath, который я получаю с помощью элемента проверки, — это «//*[@id=»pppListUl»]/li1/ div2/span2/span»
Мои scrpits такие, как показано ниже:
a <- html("http://www.cpppc.org:8082/efmisweb/ppp/projectLivrary/toPPPList.do")
b <- html_nodes(a, xpath = '//*[@id="pppListUl"]/li[1]/div[2]/span[2]/span')
b
Затем я получил результат
{xml_nodeset (0)}
Затем я проверяю источник страницы, я даже ничего не нашел о проекте, который я выбрал.
Мне было интересно, почему я не могу найти его в источнике страницы и, в свою очередь, как я могу получить узел с помощью rvest.
Ответ №1:
Он отправляет запрос XHR для содержимого. Просто работайте с этими данными (это довольно чисто):
library(httr)
POST('http://www.cpppc.org:8082/efmisweb/ppp/projectLivrary/getPPPList.do?tokenid=null',
encode="form",
body=list(queryPage=1,
distStr="",
induStr="",
investStr="",
projName="",
sortby="",
orderby="",
stageArr="")) -> res
content(res, as="text") %>%
jsonlite::fromJSON(flatten=TRUE) %>%
dplyr::glimpse()
(StackOverflow недостаточно продвинут, чтобы позволить мне опубликовать вывод этого, поскольку он считает, что это спам).
Это список из 4 элементов с полями totalCount
, list
(который содержит фактические данные), currentPage
и totalPage
.
Похоже, вы можете изменить queryPage
переменную формы для перебора страниц, чтобы получить весь список / базу данных, что-то вроде:
library(httr)
library(purrr)
library(dplyr)
get_page <- function(page_num=1, .pb=NULL) {
if (!is.null(.pb)) pb$tick()$print()
POST('http://www.cpppc.org:8082/efmisweb/ppp/projectLivrary/getPPPList.do?tokenid=null',
encode="form",
body=list(queryPage=page_num,
distStr="",
induStr="",
investStr="",
projName="",
sortby="",
orderby="",
stageArr="")) -> res
content(res, as="text") %>%
jsonlite::fromJSON(flatten=TRUE) -> dat
dat$list
}
n <- 5 # change this to the value in `totalPage`
pb <- progress_estimated(n)
df <- map_df(1:n, get_page, pb)