2015-04-18 15 views
10

Tôi lấy mã sau đây từ gói rNomads và sửa đổi nó một chút.R WebCrawler - Nội dung XML có vẻ không phải là XML:

Khi ban đầu chạy nó tôi nhận được:

> 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' 

Đây là mã:

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") 

Bất kỳ đề nghị những gì tôi đang làm sai?

CẬP NHẬT

Hello guys,

tôi bắt đầu săn tiền thưởng này, bởi vì tôi nghĩ rằng trong cộng đồng R có cần thiết phải là một chức năng như vậy, có thể bò trang web. Các giải pháp, trong đó sẽ giành chiến thắng tiền thưởng sẽ hiển thị một chức năng mà phải mất hai thông số:

WebCrawler(url = "www.bikeforums.net", xpath = "\\title") 
  • Như ra tôi muốn có một khung dữ liệu với hai cột: liên kết trang web và nếu biểu thức Ví dụ xpath phù hợp một cột có biểu thức phù hợp.

Tôi thực sự đánh giá cao trả lời của bạn

+0

Nếu bạn chạy 'doc <- XML ​​:: htmlParse (" http://www.bikeforums.net "); các liên kết <- XML ​​:: xpathSApply (doc, "// a/@ href") 'thủ công nó hoạt động nhưng trong hàm (sử dụng chế độ gỡ lỗi) doc trở lại trống ... đây là lạ – Rentrop

+0

Hãy thử với' url = "http : //www.bikeforums.net "' và cho tôi biết –

+0

@dimitris_ps Khi tôi chạy '> WebCrawler (url =" http://www.bikeforums.net ")' Tôi get'Error: không tải được thực thể bên ngoài "/"' – mrquad

Trả lời

2

Chèn đoạn mã sau dưới links <- XML::xpathSApply(doc, "//a/@href") trong chức năng của bạn.

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) 

Và cũng nhớ để có url như http://www......

Ngoài ra bạn không cập nhật danh sách urls.out của bạn. Như bạn có, danh sách này sẽ luôn là danh sách trống có độ dài giống như độ dài links

+1

Có thể tôi nhầm lẫn nhưng 'liên kết <- liên kết [grepl (" http ", liên kết)]' loại trừ các liên kết tương đối, ví dụ: '/ archive/index.php /' sẽ bị loại trừ theo cách này sẽ không? – Rentrop

+0

Có chính xác. Tôi sẽ cập nhật câu trả lời, cảm ơn @ Floo0 –

+0

Xin chào, những gì hiện "Ngoài ra bạn không cập nhật danh sách urls.out của bạn" có nghĩa là? Tôi cũng nhận được lỗi tương tự. Làm thế nào tôi có thể chắc chắn rằng nó cập nhật? –

Các vấn đề liên quan