Записи, не добавляемые в Dataframe в R

У меня есть датафрейм uuu_df с записями в виде ссылок сайта

dim(uuu_df)
output
1950  1

uuu_df

1) http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=1&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs
2) http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=2&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs
3) http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=3&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs
.
.
.
1950) http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=>5&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=20-Crores&BudgetMax=20-Crores

здесь я пытаюсь очистить данные, используя эти множественные ссылки из фрейма данных вместе с условием, т. е. если текст атрибута html равен "Результатов не найдено!" затем пропустите эту запись и перейдите к следующей записи, это фрагмент этой очистки

UrlPage <- html("http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=2&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs")
ImgNode <- UrlPage %>% html_node("div.noResultHead")
u=ImgNode
u=as(u,"character")
u=paste("No",word(string = u, start = 4, end = 5),sep = " ")

Вот что я пробовал

 wines=data.frame()
    url_test=c()
    UrlPage_test=c()
    u=c()
    ImgNode=c()

    for(i in 1:dim(uuu_df)[1]){

      url_test[i]=as.character(uuu_df[i,])
      UrlPage_test[i] <- html(url_test[i])
      ImgNode[i] <- UrlPage_test[i] %>% html_node("div.noResultHead")
      u[i]=ImgNode[i]
      u[i]=as(u[i],"character")
      u[i]=paste("No",word(string = u, start = 4, end = 5),sep = " ")

      if(u[i]=="No Results Found!") next
      {
        map_df(1:5, function(i) # here 1:5 is number of webpages of a website 
{

          # simple but effective progress indicator
          cat(".")

          pg <- read_html(sprintf(url_test, i))

          data.frame(wine=html_text(html_nodes(pg, ".agentNameh")),
                     excerpt=html_text(html_nodes(pg, ".postedOn")),
                     locality=html_text(html_nodes(pg,".localityFirst")),
                     society=html_text(html_nodes(pg,'.labValu .stop-propagation:nth-child(1)')),
                     stringsAsFactors=FALSE)

        }) -> wines

      }

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

PS: dput() воспроизводимых данных

text1="http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom="
text2="1"
text3="&proptype="
text4="Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment"
text5="&cityName=Thane&BudgetMin="
text6="&BudgetMax="



bhk=c("1","2","3","4","5",">5")
budg_min=c("5-Lacs","10-Lacs","20-Lacs","30-Lacs","40-Lacs","50-Lacs","60-Lacs","70-Lacs","80-Lacs","90-Lacs","1-Crores","1.2-Crores","1.4-Crores","1.6-Crores","1.8-Crores","2-Crores","2.3-Crores","2.6-Crores","3-Crores","3.5-Crores","4-Crores","4.5-Crores","5-Crores","10-Crores","20-Crores")
budg_max=c("5-Lacs","10-Lacs","20-Lacs","30-Lacs","40-Lacs","50-Lacs","60-Lacs","70-Lacs","80-Lacs","90-Lacs","1-Crores","1.2-Crores","1.4-Crores","1.6-Crores","1.8-Crores","2-Crores","2.3-Crores","2.6-Crores","3-Crores","3.5-Crores","4-Crores","4.5-Crores","5-Crores","10-Crores","20-Crores")
eg <- expand.grid(bhk = bhk, budg_min = budg_min, budg_max = budg_max)
eg <- eg[as.integer(eg$budg_min) <= as.integer(eg$budg_max),]
uuu <- sprintf("%s%s%s%s%s%s%s%s", text1,eg[,1],text3,text4,text5,eg[,2],text6,eg[,3])
uuu_df=data.frame(Links=uuu)
dput(uuu_df)

2 ответа

Рассмотрите возможность работы с одним большим списком, созданным с использованием lapply который выполняет итерацию по столбцу url в dataframe вместо того, чтобы управлять множеством меньших векторов:

urlList <- lapply(uuu_df[1,], function(url){     

    UrlPage <- html(as.character(url))
    ImgNode <- UrlPage %>% html_node("div.noResultHead")
    u <- paste("No", word(string = as(ImgNode, "character"), start=4, end=5), sep=" ")

    cat(".")        
    pg <- read_html(url)

    if(u!="No Results Found!") {
        df <- data.frame(wine=html_text(html_nodes(pg, ".agentNameh")),
                         excerpt=html_text(html_nodes(pg, ".postedOn")),
                         locality=html_text(html_nodes(pg,".localityFirst")),
                         society=html_text(html_nodes(pg,'.labValu .stop-propagation:nth-child(1)')),
                         stringsAsFactors=FALSE)
    } else {
        # ASSIGN EMPTY DATAFRAME (FOR CONSISTENT STRUCTURE)
        df <- data.frame(wine=c(), excerpt=c(), locality=c(), society=c())
    }
    # RETURN NAMED LIST
    return(list(UrlPage=UrlPage, ImgNode=ImgNode, u=u, df=df))    
})

# ROW BIND ONLY DATAFRAME ELEMENT FROM LIST
wines <- map_df(urlList, function(u) u$df)                  

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

Примечание: llply имеет .progress аргумент, который более элегантно обрабатывает индикатор прогресса, который вы пытались разработать, используя cat(),

options(stringsAsFactors = FALSE)
library(plyr)
library(dplyr)
library(xml2)

uuu_df <- data.frame(x = c('http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=1&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs',
                           'http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=2&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=5-Lacs',
                           'http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=3&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment&cityName=Thane&BudgetMin=5-Lacs&BudgetMax=90-Lacs'))

urlList <- llply(uuu_df[,1], function(url){     

  this_pg <- read_html(url)

  results_count <- this_pg %>% 
    xml_find_first(".//span[@id='resultCount']") %>% 
    xml_text() %>%
    as.integer()

  if(results_count > 0){

    cards <- this_pg %>% 
      xml_find_all('//div[@class="SRCard"]')

    df <- ldply(cards, .fun=function(x){
      y <- data.frame(wine = x %>% xml_find_first('.//span[@class="agentNameh"]') %>% xml_text(),
                      excerpt = x %>% xml_find_first('.//div[@class="postedOn"]') %>% xml_text(),
                      locality = x %>% xml_find_first('.//span[@class="localityFirst"]') %>% xml_text(),
                      society = x %>% xml_find_first('.//div[@class="labValu"]') %>% xml_text() %>% gsub('\\n', '', .))
      return(y)
    })

  } else {
    df <- NULL
  }

  return(df)   
}, .progress = 'text')
names(urlList) <- uuu_df[,1]

bind_rows(urlList)
Другие вопросы по тегам