Значения не вводятся в фрейм данных из веб-поиска - PullRequest
0 голосов
/ 18 октября 2018

Моя главная цель - извлечь контент с сайта.Я хочу сохранить это локально.После того, как содержимое должно обновляться на веб-сайте, оно также должно отражать локальные данные.
Я могу читать данные с веб-страницы, использованной в коде, теперь я хочу сохранить результат во фрейме данных, чтобы я мог экспортироватьрезультат.Я хочу, чтобы значения x6 вводились во фрейм данных df, чтобы я мог экспортировать результат фрейма данных в текстовый файл или файл Excel или предложить другой способ извлечения данных из веб-страницы, использованной в коде (веб-утилизация). В этом я хочу, чтобы мой цикл for не работал, поэтому, пожалуйста, кто-нибудь, помогите мне.

library(rvest)
library(dplyr)
library(qdapRegex) # install.packages("qdapRegex")

google <- read_html("https://bidplus.gem.gov.in/bidresultlists")

(x <- google %>%
  html_nodes(".block") %>%
  html_text())

class(x)

(x1 <- gsub("                                                            ", "", x))
(x2 <- gsub("                                                        ", "", x1))
(x3 <- gsub("            ", "", x2))
(x4 <- gsub("    ", "", x3))
(x5 <- gsub("  ", "", x4))
(x6 <- gsub("\n", "", x5))

class(x6)
length(x6[i])
typeof(x6)

for (i in x6) {

  BIDNO <- rm_between(x6[i], "BID NO:", "Status", extract = TRUE)
  Status <- rm_between(x6[i], "Status:", "Quantity Required", extract = TRUE)
  Quantity_Required <- rm_between(x6[i], "Quantity Required:", "Department Name And Address", extract = TRUE)
  Department_Name_And_Address <- rm_between(x6[i], "Department Name And Address:", "Start Date", extract = TRUE)
  Start_Date <- rm_between(x6[i], "Start Date:", "End Date", extract = TRUE)
  # End_Date <- rm_between(x6[i], "End Date: ", "Technical Evaluation", extract=TRUE)

  df <- data.frame("BID_NO", "Status", "Quantity_Required", "Department_Name_Address", "Start_Date")
}

df

View(df)

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Ориентация на нужные элементы с помощью 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. И вы должны прочитать о регулярных выражениях, так как подсчет пробелов для подстановки - это также путь, чреватый опасностями и разочарованием.

0 голосов
/ 18 октября 2018

Кажется, проблема в том, что вы создали группу строк с BID_NO и т. Д. В кавычках.Если вы пытаетесь сохранить значения в кадре данных, вам нужно сохранить имена переменных, в которые вы вместо этого сохранили значения, в кадре данных.

df<-data.frame(BID_NO,Status,Quantity_Required,Department_Name_Address,Start_Date)

При условии, что весь код, который создает каждое поле, является правильным выше, и значения сохраняются в этих переменных, вы получите ОДИН СТРОК данных, потому что он создан в цикле for, поэтомупри каждой итерации вы будете переписывать последнюю версию.

Если вы хотите сохранить несколько строк, создайте final_df перед циклом.Затем

data.frame(rbind(final_df, df)) свяжет строку данных с пустым фреймом при первом проходе, а затем каждый раз будет добавлять новую строку.

Но любой фрейм данных, созданный в цикле, будет создан зановокаждый проход и перезаписывается ... и сохраняет значения из переменной без hh ' ' вокруг них ...

...