curlMultiperform(多句柄)出错:在字符串中嵌入nul

时间:2014-08-01 23:44:33

标签: r curl rcurl

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

代码:

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\

1 个答案:

答案 0 :(得分:2)

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

事实证明,网页编码不当。它声称是&#34; ISO-8859-1&#34;,但在某些页面上有商标符号编码为\x99,这意味着它可能真的使用了&#34; Windows-1252&#34;代码页。正常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=值的替代值。