【问题标题】:R WebCrawler - XML content does not seem to be XML:R WebCrawler - XML 内容似乎不是 XML:
【发布时间】: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 &lt;- XML::htmlParse("http://www.bikeforums.net"); links &lt;- XML::xpathSApply(doc, "//a/@href"),它可以工作,但在函数内(使用调试模式)文档返回空......这很奇怪
  • 试试url="http://www.bikeforums.net" 让我知道
  • @dimitris_ps 当我运行 &gt; 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


【解决方案1】:

在您的函数中的links &lt;- 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相同的空列表

【讨论】:

  • 也许我错了,但links &lt;- links[grepl("http", links)] 不包括相关链接,例如/archive/index.php/ 这样会被排除在外,不是吗?
  • 是的,正确。我会更新答案,谢谢@Floo0
  • 嗨,“你也没有更新你的 urls.out 列表”是什么意思?我也遇到同样的错误。如何确保它更新?
  • 这部分urls.out &lt;- vector("list", length = length(links)) 只是每次创建一个空列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-09-24
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多