如何在选择器节点中缺少值时刮取数据

时间:2017-09-28 07:36:09

标签: r rvest

您好我正在尝试从R中的ebay中抓取数据,我使用了下面提到的代码,但我遇到了一个问题,其中特定选择器元素缺少值,为了绕过它我使用了一个for循环如图所示(检查每个清单并给出数据缺失的数字)因为数据删除的数量较少,可以检查,但是当需要清理大量数据时如何进行检查。 提前致谢

library(rvest)

url<-"https://www.ebay.in/sch/i.html_from=R40&_sacat=0&LH_ItemCondition=4&_ipg=100&_nkw=samsung+j7"

web<- read_html(url)

subdescp<- html_nodes(web, ".lvsubtitle+ .lvsubtitle")

subdescp1<-html_text(subdescp)

head(subdescp1)

library(stringr)

subdescp1<- str_replace_all(subdescp1, "[\t\n\r]" , "")

head(subdescp1)

for (i in c(5,6,10,19,33,34,35)){
  a<-subdescp1[1:(i-1)]
  b<-subdescp1[i:length(subdescp1)]
  subdescp1<-append(a,list("NA"))
  subdescp1<-append(subdescp1,b)
}

Z<-as.character(subdescp1)
Z

webpage <- read_html(url)

Descp_data_html <- html_nodes(webpage,'.vip')

Descp_data <- html_text(Descp_data_html)

head(Descp_data)

price_data_html <- html_nodes(web,'.prc .bold')

price_data <- html_text(price_data_html)

head(price_data)

library(stringr)

price_data<-str_replace_all(price_data, "[\t\n]" , "")

price_data<-gsub("Rs. ","",price_data)


price_data<-gsub(",","",price_data)

price_data<- as.numeric(price_data)

price_data

Desc_data_html <- html_nodes(webpage,'.lvtitle+ .lvsubtitle')

Desc_data <- html_text(Desc_data_html, trim = TRUE)

head(Desc_data)

j7_f2<-data.frame(Title = Descp_data, Description= Desc_data, Sub_Description= Z, Pirce = price_data)

2 个答案:

答案 0 :(得分:0)

例如,你可以使用这样的东西。

data <- read_html("url.xml")


var <- data %>% html_nodes("//node") %>% xml_text() 

# observations that don´t have certain nodes - fill them with NA
var_pair <- data %>% html_nodes("node_var_pair") 

var_missing_clean = sapply(var_pair, function(x) {
  tryCatch(xml_text(html_nodes(x, "./var_missing")),
           error=function(err) NA)
})

df = data.frame(var, var_pair, var_missing)

您可以考虑三种类型的节点。 var收集没有丢失数据的节点。 var_pair包括您要与包含缺失观察的节点配对的节点,var_missing指的是缺少信息的节点。您可以创建变量并将其聚合在数据数据框(df

答案 1 :(得分:0)

这里的过程很简单,分两步进行 - 首先提取块级别的所有节点(不是每个元素,也不要转换为文本)。这是一个长度等于块数的列表。从提取的列表中提取第二个元素作为文本并清除它。由于这是从列表中完成的,因此适用的NA会在适当的位置自动强制执行。查看来自同一ebay India网站的示例:

library(rvest)
library(stringr)

# specify the url
url <-"https://www.ebay.in/sch/Mobile-Phones"

# read the page
web <- read_html(url)

# define the supernode that has the entire block of information
super_node <- '.li' 

# read as vector of all blocks of supernode (imp: use html_nodes function)
super_node_read <- html_nodes(web, super_node)

# define each node element that you want
node_model_details <- '.lvtitle'
node_description_1 <- '.lvtitle+ .lvsubtitle'
node_description_2 <- '.lvsubtitle+ .lvsubtitle'
node_model_price   <- '.prc .bold'
node_shipping_info <- '.bfsp'

# extract the output for each as cleaned text (imp: use html_node function)
model_details <- html_node(super_node_read, node_model_details) %>%
    html_text() %>%
    str_replace_all("[\t\n\r]" , "")

description_1 <- html_node(super_node_read, node_description_1) %>%
    html_text() %>%
    str_replace_all("[\t\n\r]" , "")

description_2 <- html_node(super_node_read, node_description_2) %>%
    html_text() %>%
    str_replace_all("[\t\n\r]" , "")

model_price  <- html_node(super_node_read, node_model_price) %>%
    html_text() %>%
    str_replace_all("[\t\n\r]" , "")

shipping_info <- html_node(super_node_read, node_shipping_info) %>%
    html_text() %>%
    str_replace_all("[\t\n\r]" , "")

# create the data.frame
mobile_phone_data <- data.frame(
    model_details,
    description_1,
    description_2,
    model_price,
    shipping_info
)