2017-06-16 118 views
0

webscraping附加在数据帧的行我有数据帧7行1列,其中包含一个网站链接,我想从这些不同的链接中提取数据,并将其存储在数据框架,但不能附加that.Also我检查,如果为一个链接,如果没有记录(这是我通过该链接的html属性检查)跳过该链接,并继续下一个链接。 我也试图为多个页面的链接提取数据。R:麻烦从r中

这是重复性的数据

text1="http://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=" 
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_df1=data.frame(x=uuu[1:7,]) 
dput(uuu_df1) 

我对这个3解决方案,但没有一个似乎是工作的罚款。

解决方案#1

urlList <- llply(uuu_df1[,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_df1[,1] 

a=bind_rows(urlList) 

上面的代码给我错误Error in if (results_count > 0) { : missing value where TRUE/FALSE needed

解决方案#2

urlList <- lapply(uuu_df1[,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=character(), excerpt=character(), locality=character(), society=character()) 
    } 
    # 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) 

以上代码给出了空数据框中

解决方案#3

uuu_df1=data.frame(x=uuu_df[1:7,]) 
wines=data.frame() 
url_test=c() 
UrlPage_test=c() 
u=c() 
ImgNode=c() 
pg=c() 

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

    url_test[i]=as.character(uuu_df1[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[i] <- read_html(sprintf(url_test[i], i)) 

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

    }) -> wines 

    }} 

上面代码中还给出了一个错误

Error in UseMethod("xml_find_first") : 
    no applicable method for 'xml_find_first' applied to an object of class "list" 
In addition: Warning messages: 
1: 'html' is deprecated. 
Use 'read_html' instead. 
See help("Deprecated") 
2: In UrlPage_test[i] <- html(url_test[i]) : 
    number of items to replace is not a multiple of replacement length 

上,这样我的要求得到满足的代码可以纠正任何建议。在此先感谢

回答

1

解决方案#1

,当你做这样的事情missing value where TRUE/FALSE needed印:

if (NA > 0) { 
    do something 
} 

所以更换你的,如果条件

if(results_count > 0) 

(!is.na(results_count) & (results_count > 0)) 
+0

优秀的@herbaman,一行救了我一天。它运作良好..谢谢吨..感谢努力! – deepesh

+0

如果您选中“仅用于第7条记录”链接显示它有94条记录,但如果您只为第7条记录运行该代码,则创建的数据框只包含30条记录,而不是94条。为什么这样呢? – deepesh