Ориентация на нужные элементы с помощью XPath - это, вероятно, путь с меньшим разочарованием и ошибками:
library(rvest)
library(dplyr)
pg <- read_html("https://bidplus.gem.gov.in/bidresultlists")
Получить все блоки ставок:
blocks <- html_nodes(pg, ".block")
Целевые элементы и количество div:
items_and_quantity <- html_nodes(blocks, xpath=".//div[@class='col-block' and contains(., 'Item(s)')]")
Вытащите предметы и количество:
items <- html_nodes(items_and_quantity, xpath=".//strong[contains(., 'Item(s)')]/following-sibling::span") %>% html_text(trim=TRUE)
quantity <- html_nodes(items_and_quantity, xpath=".//strong[contains(., 'Quantity')]/following-sibling::span") %>% html_text(trim=TRUE) %>% as.numeric()
Получите название и адрес отдела.Измените его так, чтобы три линии были разделены трубами (|
).Это позволит разделить позже.Символ трубы - это боль для регулярных выражений, поскольку его необходимо экранировать, но весьма маловероятно, что в тексте будет , а вкладки могут привести к путанице в более позднее время.
department_name_and_address <- html_nodes(blocks, xpath=".//div[@class='col-block' and contains(., 'Department Name And Address')]") %>%
html_text(trim=TRUE) %>%
gsub("\n", "|", .) %>%
gsub("[[:space:]]*\\||\\|[[:space:]]*", "|", .)
Цельзаголовок блока, который имеет ставку # и статус:
block_header <- html_nodes(blocks, "div.block_header")
Извлечь ставку # (см. примечание в конце ответа):
html_nodes(block_header, xpath=".//p[contains(@class, 'bid_no')]") %>%
html_text(trim=TRUE) %>%
gsub("^.*: ", "", .) -> bid_no
Статус извлечения:
html_nodes(block_header, xpath=".//p/b[contains(., 'Status')]/following-sibling::span") %>%
html_text(trim=TRUE) -> status
Целевые и извлекаемые даты начала и окончания:
html_nodes(blocks, xpath=".//strong[contains(., 'Start Date')]/following-sibling::span") %>%
html_text(trim=TRUE) -> start_date
html_nodes(blocks, xpath=".//strong[contains(., 'End Date')]/following-sibling::span") %>%
html_text(trim=TRUE) -> end_date
Создайте фрейм данных:
data.frame(
bid_no,
status,
start_date,
end_date,
items,
quantity,
department_name_and_address,
stringsAsFactors=FALSE
) -> xdf
Некоторые из ставок "RA
", поэтомумы также можем создать столбец, сообщающий нам, какие из них:
xdf$is_ra <- grepl("/RA/", bid_no)
Результирующий фрейм данных:
str(xdf)
## 'data.frame': 10 obs. of 8 variables:
## $ bid_no : chr "GEM/2018/B/93066" "GEM/2018/B/93082" "GEM/2018/B/93105" "GEM/2018/B/93999" ...
## $ status : chr "Not Evaluated" "Not Evaluated" "Not Evaluated" "Not Evaluated" ...
## $ start_date : chr "25-09-2018 03:53:pm" "27-09-2018 09:16:am" "25-09-2018 05:08:pm" "26-09-2018 05:21:pm" ...
## $ end_date : chr "18-10-2018 03:00:pm" "18-10-2018 03:00:pm" "18-10-2018 03:00:pm" "18-10-2018 03:00:pm" ...
## $ items : chr "automotive chassis fitted with engine" "automotive chassis fitted with engine" "automotive chassis fitted with engine" "Storage System" ...
## $ quantity : num 1 1 1 2 90 1 981 6 4 376
## $ department_name_and_address: chr "Department Name And Address:||Ministry Of Steel Na Kirandul Complex N/a" "Department Name And Address:||Ministry Of Steel Na Kirandul Complex N/a" "Department Name And Address:||Ministry Of Steel Na Kirandul Complex N/a" "Department Name And Address:||Maharashtra Energy Department Maharashtra Bhusawal Tps N/a" ...
## $ is_ra : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
Я позволю вам превратить даты в POSIXct
элементы.
Непрерывный код без объяснения: здесь .
Кроме того, это не Java.for
циклы редко являются решением проблемы в R. И вы должны прочитать о регулярных выражениях, так как подсчет пробелов для подстановки - это также путь, чреватый опасностями и разочарованием.