【问题标题】:Error in curlMultiperform(multihandle): embedded nul in stringcurlMultiperform(multihandle)中的错误:字符串中嵌入了 nul
【发布时间】:2014-08-03 01:21:39
【问题描述】:

我正在尝试下载链接矢量,但收到一条错误消息,我不知道该怎么办。包括代码,希望有人有解决方法。

代码:

library(RCurl)
library(XML) 
url <- "http://www.etfs.bmo.com/bmo-etfs/"
url.parsed <- htmlParse(url)
links <- xpathSApply(url.parsed, "//table//td/a/@href")[-c(1:3)]
links <- paste0("http://www.etfs.bmo.com", links)
pages <- getURI(links)

错误信息:

Error in curlMultiPerform(multiHandle) : 
  embedded nul in string: '         \r\n                            </nobr>\r\n                        </td>\r\n\t\t\t        </tr>\r\n\t\t\t        \r\n\t\t\t\t\t        \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t        \r\n\t\t\t\t        \t<tr valign="top" >\r\n\t                \t\t\t\t<td class="highlightText"><strong>Annualized Distribution Yield \r\n\t\t                       \t\t\t\r\n\t\t   \t               \t\t\t\t\r\n\t\t    \t            \t\t\t(Jul 07, 2016)\r\n\t\t           \t       \t\t\t\t\r\n\t\t               \t       \t\t\t \r\n\t\t               \t\t\t\t\t<sup>1</sup></strong>\r\n\t\t               \t\t\t\t</td>\r\n\t\t\t            \t\t<td>\r\n                            \t\t<nobr>\r\n   \t                            \t\t\r\n    \t                        \t\t\t\r\n                \t            \t\t\t\r\n\t\t\t        \t         \t\t\t\t2.41%\r\n                        \t    \t\t\t\r\n                           \t\t\t\t \r\n    \t                        \t</nobr>\r\

【问题讨论】:

    标签: r curl rcurl


    【解决方案1】:

    好的,这需要一段时间,但我想我已经弄明白了。

    原来网页编码不正确。它声称是“ISO-8859-1”,但在某些页面上有编码为\x99 的商标符号,这意味着它可能确实在使用“Windows-1252”代码页。这个超出正常 ASCII 范围的符号会启动多字节字符读取,文件很快就会变得混乱。

    据我所知,RCurl 本身并不支持这种编码。但是您仍然可以将文件下载为二进制数据,然后使用具有更多转换选项的iconv 进行转换。这应该工作

    raw <- lapply(links, getURLContent, binary=TRUE)
    pages <- lapply(lapply(raw,readBin,"characer"), 
        iconv, from="WINDOWS-1252", to="UTF-8")
    

    现在我在我的 Mac 上进行了测试。确切的 from/to 字符串可能因平台而异。检查iconvlist() 的列表,如果这在您的机器上不起作用,可能会替换from= 值。

    【讨论】:

    • 您确定iconv() 可以处理原始输入吗?当我运行你的代码时,我得到的字符串看起来像“0d”“0a”“0d”“0a”
    • 谢谢@hadley 我在简化代码时犯了一个错误。你是对的,你必须先把raw变成一个字符。
    • 我假设您现在还会告诉我httr 有一个更简单的解决方案;)
    • 有趣 - 我只是将更改推送到 httr 以使用 readBin() 而不是 rawToChar()。然后你可以做content(r, encoding = "WINDOWS-1252")
    • 顺便说一句,我认为您的解释有点过于复杂 - 发生错误是因为rawToChar() 如果字符串中有任何嵌入的空值,则会引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2014-05-03
    • 2021-07-12
    • 2013-02-06
    • 1970-01-01
    • 2014-08-18
    • 2021-02-10
    相关资源
    最近更新 更多