【发布时间】:2015-04-18 13:04:56
【问题描述】:
我从 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")
任何建议我做错了什么?
更新
大家好,
我开始这个赏金,因为我认为在 R 社区中需要这样一个功能,它可以抓取网页。赢得赏金的解决方案应该显示一个带有两个参数的函数:
WebCrawler(url = "www.bikeforums.net", xpath = "\\title" )
- 作为输出,我希望有一个包含两列的数据框:网站链接以及示例 xpath 表达式是否匹配具有匹配表达式的列。
非常感谢您的回复
【问题讨论】:
-
如果您手动运行
doc <- XML::htmlParse("http://www.bikeforums.net"); links <- XML::xpathSApply(doc, "//a/@href"),它可以工作,但在函数内(使用调试模式)文档返回空......这很奇怪 -
试试
url="http://www.bikeforums.net"让我知道 -
@dimitris_ps 当我运行
> WebCrawler(url="http://www.bikeforums.net")我得到Error: failed to load external entity "/" -
@Floo0 是的,这真的很奇怪。我现在还添加了
rm(list = ls()),并像以前一样清理了我的工作区几次。任何建议这里可能有什么问题? -
@mrquad 第二个错误是由于网站上有相对链接。 Ofc
"//a/@href"也 greps href 之类的/但/本身不是网站。所以你必须检查链接是否是绝对的。如果它是相对的,则必须正确转换它。在此示例中,将/转换为http://www.bikeforums.net/
标签: xml r statistics