我想从网站中抓取特定的html代码。所需的对象不在下面的循环的每一页上,因此,某些值为NA。但是,每当缺少一个对象时,整个循环就会停止。
我尝试使用此代码进行非循环抓取,结果证明它可以完美工作。 在这里,我排除了所有无法获得或不感兴趣的值。
BJ <- data.frame(
Wohnungs_ID = ID,
Baujahr = ifelse (nchar(Baujahr)==0 | nchar(Baujahr)>6, NA, Baujahr),
stringsAsFactors = F
在相关情况下,我想抓取两个并不总是列出的特定变量。网址是我删除了的链接的列表。
library(rvest)
library(magrittr)
library(tidyr)
library(ggplot2)
library(stringr)
library(jsonlite)
library(purrr)
library(dplyr)
immo_webp <- read_html ("https://www.immobilienscout24.de/Suche/S-2/Wohnung-Miete/Rheinland-Pfalz/Koblenz")
# URLs
base = 'https://www.immobilienscout24.de/expose/'
urls <- sapply(read_html("https://www.immobilienscout24.de/Suche/S-2/Wohnung-Miete/Rheinland-Pfalz/Koblenz")%>%
html_nodes('article')%>%
html_attr('data-obid'), function (url){paste0(base, url)})
print(urls)
# ID bilden
substring(urls, 1, 1)
ID <- substring(urls, 41)
Baujahr <- c(1 : 20)
Energie <- c(1 : 20)
for (i in urls){
aktuellewohnung <- read_html(url(i))
Baujahr[i] <- aktuellewohnung %>%
html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(1) > dd") %>%
html_text()
Energie[i] <- aktuellewohnung %>%
html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(7) > dd") %>%
html_text()
}
我遇到以下错误。
Error in Baujahr[i] <- aktuellewohnung %>% html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(1) > dd") %>% :
replacement has length zero
我希望此循环有效,同时将缺少的值另存为NA。 希望你能帮助我。 提前谢谢。
答案 0 :(得分:1)
使用它代替循环:
1
如果找不到该字段,则results_df <- lapply(urls, function(u) {
message(u)
aktuellewohnung <- read_html(u)
Baujahr <- aktuellewohnung %>%
html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(1) > dd") %>%
html_text()
Energie <- aktuellewohnung %>%
html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(7) > dd") %>%
html_text()
tibble(
Baujahr = ifelse(length(Baujahr) == 0, NA, Baujahr),
Energie = ifelse(length(Energie) == 0, NA, Energie)
)
}) %>%
bind_rows()
循环将返回lapply
的列表,其中有data.frames
。 NA
将其转换为一个bind_rows()
。
答案 1 :(得分:0)
在分配值时尝试使用trycatch
function
Baujahr[i] <- tryCatch({aktuellewohnung %>%
html_nodes("#is24-content > div.grid-item.padding-desk-right-xl.desk-two-thirds.lap-one-whole.desk-column-left.flex-item.palm--flex__order--1.lap--flex__order--1 > div.is24-ex-details.main-criteria-headline-size.two-column-layout > div.criteriagroup.flex.flex--wrap.criteria-group--spacing.padding-top-s > div.criteriagroup.criteria-group--border.criteria-group--two-columns.criteria-group--spacing > dl:nth-child(1) > dd") %>%
html_text()},error = function(cond){NA})