Веб-парсинг с использованием rvest в R

Я пытался удалить информацию с URL-адреса в R с помощью пакета rvest:

url <-'https://eprocure.gov.in/cppp/tendersfullview/id%3DNDE4MTY4MA%3D%3D/ZmVhYzk5NWViMWM1NTdmZGMxYWYzN2JkYTU1YmQ5NzU%3D/MTUwMjk3MTg4NQ%3D%3D'

но я не могу правильно идентифицировать xpath даже после использования плагина селектора.

Код, который я использую для получения первой таблицы, выглядит следующим образом:

detail_data <- read_html(url)
detail_data_raw <- html_nodes(detail_data, xpath='//*[@id="edit-t-
fullview"]/table[2]/tbody/tr[2]/td/table')
detail_data_fine <- html_table(detail_data_raw)

Когда я пробую приведенный выше код, detail_data_raw приводит к {xml_nodeset (0)} и, следовательно, detail_data_fine является пустым списком ()

Информация, которую я хочу удалить, находится под заголовками:

Детали организации

Детали тендера

Критические даты

Детали работы

Подробная информация об органе, приглашающем к участию в тендере

Любая помощь или идеи о том, что идет не так и как это исправить, приветствуются.


person Shikhar Parashar    schedule 18.08.2017    source источник
comment
Сначала проверьте свой URL. Похоже, у вас неправильный URL.   -  person Aleksandr    schedule 18.08.2017
comment
URL-адрес работает нормально, когда я вставляю его в свой браузер. Есть ли что-то еще, что мне нужно сделать, чтобы это проверить?   -  person Shikhar Parashar    schedule 18.08.2017
comment
Я бы рекомендовал использовать RSelenium, так как этот сайт возвращает динамическую разметку html. Разметка, которую вы анализируете с помощью своей функции, и разметка, которую вы получаете при нажатии на ссылку, не совпадают. RSelenium должен решить эту проблему, так как имитирует поведение пользователей.   -  person Aleksandr    schedule 18.08.2017


Ответы (2)


Ваш пример URL не работает ни для кого, но если вы хотите получить данные для определенного тендера, тогда:

library(rvest)
library(stringi)
library(tidyverse)

pg <- read_html("https://eprocure.gov.in/mmp/tendersfullview/id%3D2262207")

html_nodes(pg, xpath=".//table[@class='viewtablebg']/tr/td[1]") %>% 
  html_text(trim=TRUE) %>% 
  stri_replace_last_regex("\ +:$", "") %>% 
  stri_replace_all_fixed(" ", "_") %>% 
  stri_trans_tolower() -> tenders_cols

html_nodes(pg, xpath=".//table[@class='viewtablebg']/tr/td[2]") %>% 
  html_text(trim=TRUE) %>% 
  as.list() %>% 
  set_names(tenders_cols) %>% 
  flatten_df() %>% 
  glimpse()
## Observations: 1
## Variables: 15
## $ organisation_name            <chr> "Delhi Jal Board"
## $ organisation_type            <chr> "State Govt. and UT"
## $ tender_reference_number      <chr> "Short NIT. No.20 (Item no.1) EE ...
## $ tender_title                 <chr> "Short NIT. No.20 (Item no.1)"
## $ product_category             <chr> "Civil Works"
## $ tender_fee                   <chr> "Rs.500"
## $ tender_type                  <chr> "Open/Advertised"
## $ epublished_date              <chr> "18-Aug-2017 05:15 PM"
## $ document_download_start_date <chr> "18-Aug-2017 05:15 PM"
## $ bid_submission_start_date    <chr> "18-Aug-2017 05:15 PM"
## $ work_description             <chr> "Replacement of settled deep sewe...
## $ pre_qualification            <chr> "Please refer Tender documents."
## $ tender_document              <chr> "https://govtprocurement.delhi.go...
## $ name                         <chr> "EXECUTIVE ENGINEER (NORTH)-II"
## $ address                      <chr> "EXECUTIVE ENGINEER (NORTH)-II\r\...

кажется, работает нормально без установки Python и использования Selenium.

person hrbrmstr    schedule 18.08.2017
comment
Ссылки по-прежнему работают идеально ... Но ваше решение действительно работает для меня ... при условии, что данные в Централизованных электронных закупках такие же, как и на портале проектов в режиме миссии. - person Shikhar Parashar; 18.08.2017
comment
Нам все еще не хватает столбцов с правой стороны, таких как подкатегория продуктов, EMD и т. Д. ... Те, которые находятся с правой стороны отдельных таблиц. Какие-либо предложения???? - person Shikhar Parashar; 18.08.2017
comment
вероятно. Я привел пример ответа, который можно легко дополнить. Вероятно, ваша ссылка работает для вас из-за файлов cookie / сеансов / и т. Д. - person hrbrmstr; 18.08.2017

Взгляните на «динамический поиск по сети». Обычно, когда вы вводите URL-адрес в своем браузере, он отправляет запрос на получение хост-серверу. Хост-сервер создает HTML-страницу со всеми данными и отправляет ее вам. На динамических страницах сервер просто отправляет вам HTML-шаблон, который при открытии запускает javascript в вашем браузере, который затем извлекает данные, заполняющие шаблон.

Я бы рекомендовал очистить эту страницу с помощью Python и библиотеки Selenium. Библиотека Selenium дает вашей программе возможность ждать, пока javascript не запустится в вашем браузере и не получит данные. См. Ниже вопрос, который у меня был по той же концепции, и очень полезный ответ.

Парсер BeautifulSoup не может получить доступ к элементам html

person matthew matthee    schedule 18.08.2017
comment
Я бы рекомендовал не предлагать другой язык программирования, когда OP разместил это под тегом R и когда R имеет такие же или лучшие возможности очистки и обработки HTML, чем предложенный вами язык. - person hrbrmstr; 18.08.2017
comment
Любой другой альтернативный способ по сравнению с Selenium ??? Столкнулись с проблемами при запуске сервера Selenium. Пробовал как через R, так и через вариант Windows, предусмотренный в vigenette. - person Shikhar Parashar; 18.08.2017
comment
Я смотрел и ничего не вижу. Возможно, воспользуйтесь этим руководством - r-bloggers.com/scraping-with-selenium - в качестве шаблона, затем настройте под свои цели - person matthew matthee; 18.08.2017