rvest не удается найти узел с помощью xpath

#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)