R WebCrawler - XML-контент, похоже, не является XML:
Я взял следующий код из пакета rNomads и немного изменил его.
При первом запуске я получаю:
> WebCrawler(url = "www.bikeforums.net")
[1] "www.bikeforums.net"
[1] "www.bikeforums.net"
Warning message:
XML content does not seem to be XML: 'www.bikeforums.net'
Вот код:
require("XML")
# cleaning workspace
rm(list = ls())
# This function recursively searches for links in the given url and follows every single link.
# It returns a list of the final (dead end) URLs.
# depth - How many links to return. This avoids having to recursively scan hundreds of links. Defaults to NULL, which returns everything.
WebCrawler <- function(url, depth = NULL, verbose = TRUE) {
doc <- XML::htmlParse(url)
links <- XML::xpathSApply(doc, "//a/@href")
XML::free(doc)
if(is.null(links)) {
if(verbose) {
print(url)
}
return(url)
} else {
urls.out <- vector("list", length = length(links))
for(link in links) {
if(!is.null(depth)) {
if(length(unlist(urls.out)) >= depth) {
break
}
}
urls.out[[link]] <- WebCrawler(link, depth = depth, verbose = verbose)
}
return(urls.out)
}
}
# Execution
WebCrawler(url = "www.bikeforums.net")
Любая рекомендация, что я делаю неправильно?
UPDATE
Привет, ребята,
Я начал эту награду, потому что я думаю, что в сообществе R существует потребность в такой функции, которая может сканировать веб-страницы. Решение, которое выиграло бы награду, должно показать функцию, которая принимает два параметра:
WebCrawler(url = "www.bikeforums.net", xpath = "\\title" )
- В качестве вывода я хотел бы иметь фрейм данных с двумя столбцами: ссылка на сайт и если пример выражения xpath соответствует столбцу с совпадающим выражением.
Я очень ценю ваши ответы
Ответы
Ответ 1
Вставьте следующий код под links <- XML::xpathSApply(doc, "//a/@href")
в свою функцию.
links <- XML::xpathSApply(doc, "//a/@href")
links1 <- links[grepl("http", links)] # As @Floo0 pointed out this is to capture non relative links
links2 <- paste0(url, links[!grepl("http", links)]) # and to capture relative links
links <- c(links1, links2)
И также помните, что url
как http://www......
Также вы не обновляете свой список urls.out
. Как и у вас, он всегда будет пустым списком длины, таким же, как длина links