Я пытаюсь извлечь некоторые данные с HTML-сайта. У меня есть 500 узлов, которые должны содержать дату, заголовок и резюме. Используя
url <- "https://www.bild.de/suche.bild.html?type=article&query=Migration&resultsPerPage=1000"
html_raw <- xml2::read_html(url)
main_node <- xml_find_all(html_raw, "//section[@class='query']/ol") %>%
xml_children()
xml_find_all(main_node, ".//time") #time
xml_find_all(main_node, ".//span[@class='headline']") #title
xml_find_all(main_node, ".//p[@class='entry-content']") #summary
он возвращает три вектора с датами, заголовками и резюме, которые затем можно связать вместе. По крайней мере теоретически. К сожалению, мой Кодекс находит 500 дат, 500 заголовков, но только 499 резюме. Причина в том, что просто отсутствует один из узлов.
Это оставляет меня с проблемой, что я не могу связать это с фреймом данных из-за разницы в длине. Резюме не соответствовали точным датам и названиям.
Простым решением было бы перебрать узлы в цикле и заменить пустой узел заполнителем, например «NA».
dates <- c()
titles <- c()
summaries <- c()
for(i in 1:length(main_node)){
date_temp <- xml_find_all(main_node[i], ".//time") %>%
xml_text(trim = TRUE) %>%
as.Date(format = "%d.%m.%Y")
title_temp <- xml_find_all(main_node[i], ".//span[@class='headline']") %>%
xml_text(trim = TRUE)
summary_temp <- xml_find_all(main_node[i], ".//p[@class='entry-content']") %>%
xml_text(trim = TRUE)
if(length(summary_temp) == 0) summary_temp <- "NA"
dates <- c(dates, date_temp)
titles <- c(titles, title_temp)
summaries <- c(summaries, summary_temp)
}
Но это делает простой трехстрочный код ненужным длинным. Итак, мой вопрос, я думаю, такой: есть ли более сложный подход, чем цикл?
xml_find_first
, которая всегда будет возвращать значение или возвращать NA, если узел не найден. - person Dave2e   schedule 15.04.2019