【问题标题】:How to fix this RCurl error?如何修复此 RCurl 错误?
【发布时间】:2014-03-01 07:07:38
【问题描述】:

我想就我目前遇到的问题提出一个问题。尝试抓取 HTML 页面(使用 RCurl)时,我遇到此错误:“curlMultiPerform(multiHandle)中的错误:字符串中嵌入 nul”。我读了很多关于这种类型的错误和如何处理它的建议(包括来自 RCurl 包的创建者 Duncan Temple Lang 的一篇)。但即使在应用了他的建议(如下)之后,我也遇到了同样的错误:

htmlPage <- rawToChar(getURLContent(url, followlocation = TRUE, binary = TRUE))
doc <- htmlParse(htmlPage, asText=TRUE)

我错过了什么吗?任何帮助将不胜感激!


编辑:

但是,我在原帖中没有提到第二个错误。它发生在这里:

data <- lapply(i <- 1:length(links),
               function(url) try(read.table(bzfile(links[i]),
                                            sep=",", row.names=NULL)))

错误:Error in bzfile(links[i]) : invalid 'description' argument

'links' 是文件的完整 URL 列表,构造如下:

links <- lapply(filenames, function(x) paste(url, x, sep="/"))

通过使用links[i],我试图在`lapply() 的持续迭代中引用链接列表的当前元素。


第二次编辑:

目前我正在努力使用以下代码。我发现了另外几个案例,人们建议的方法完全相同,这让我很好奇为什么它在我的情况下不起作用......

getData <- function(x) try(read.table(bzfile(x), sep = ",", row.names = NULL))
data <- lapply(seq_along(links), function(i) getData(links[[i]]))

【问题讨论】:

  • @mnel: 'url' 是开源项目存储库信息的网页的 HTTP URL,例如:flossdata.syr.edu/data/fc/2013/2013-Dec
  • htmlParse 来自什么包?此外,您能否在打印输出时包含脚本,例如,很清楚错误出现在哪里(第一行或第二行)?谢谢。
  • 另外,如果它在第二部分,可以尝试使用gsub 来获得大部分路径,例如gsub("&lt;[^&gt;]+&gt;", "", htmlPage, perl = TRUE)。我不确定这是否正是您正在寻找的,但也许它朝着正确的方向发展? (请注意,这不是一个超级通用的解决方案,例如,我可以提出打破它的示例,但它可能适用于您正在考虑的特定页面。)
  • @DavidDiez:感谢您的 cmets。实际上,这使我能够更准确地查明错误的位置 - 似乎该问题与htmlParse 无关(顺便说一句,它来自XML 包)。我仍在几个地方打印调试信息,以更准确地找出问题所在和问题所在。一旦我知道更多将报告。感谢您的帮助!
  • 该错误意味着您正在尝试读取包含 nul 字节的二进制文件。 R 不喜欢知道如何处理它们(或者不能对它们做任何事情,这取决于你想怎么想),所以它失败了。您是否正在尝试阅读您链接到的页面?还是该页面上链接的文件之一?如果它是其中一个文件,请注意它们是经过 bzip 压缩的,因此如果不先解压缩它们(甚至有些不是文本文件),您将无法将它们转换为字符。

标签: r web-scraping rcurl


【解决方案1】:

我能够自己弄清楚上述问题的原因。我花了很多时间和精力,但这是值得的——现在我更了解 R listslapply()

基本上,我做了三个主要的改变:

1) 添加textConnection()readLines() 来处理类似CSV 的文件:

conn <- gzcon(bzfile(file, open = "r"))
tConn <- textConnection(readLines(conn))

但是,我发现这种方法存在一些问题 - 请参阅我的另一个 SO 问题:Extremely slow R code and hanging

2) 使用正确的订阅表示法来引用 function(i) 中传递给 lapply() 的适当列表元素:

url <- links[[1]][i]

3) 使用正确的订阅符号来引用 lapply() 的整个列表:

data <- lapply(seq_along(links[[1]]), getData)

感谢所有参与并帮助回答此问题的人!

【讨论】:

    【解决方案2】:

    萨沙,

    试试这个

    library(XML)
    url <- "http://flossdata.syr.edu/data/fc/2013/2013-Dec/"
    doc <- htmlParse(url)
    ndx <- getNodeSet(doc,"//table")
    

    它就像一个魅力。

    祝你好运。

    S.

    【讨论】:

    • S.!请检查您的电子邮件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多