rvest | read_xml声明read_html没有的错误

时间:2015-10-17 07:43:11

标签: r encoding web-scraping rvest

采取以下网址

URL <- "http://www.google.de/complete/search?output=toolbar&q=TDS38311DE"
doc <- read_xml(URL)

我收到以下错误:

Error: Input is not proper UTF-8, indicate encoding !
Bytes: 0xDF 0x20 0x2F 0x20 [9]

使用read_html代替一切都很好 难道我做错了什么?为什么会出现这种错误?

1 个答案:

答案 0 :(得分:2)

首先:rvest使用xml2来获取内容,因此您应该在该包gh vs rvest下提交与之相关的任何问题。

其次,read_xml 选择 encoding参数是有原因的,是这样说的“除非另有说明,否则假设XML文档如果文档不是UTF-8/16,并且缺少明确的编码指令,则允许您提供默认值。“

XML文件具有specify an encoding的能力,但谷歌的这种“AJAX-y”响应显然不是(并且它不是预期你会被盗的东西,它知道它正在被阅读 - 通常是 - HTML解析引擎[又名浏览器],而不是XML解析引擎。

rvest曾经这样做过:

encoding <- encoding %||% default_encoding(x)

xml2::read_xml(httr::content(x, "raw"), encoding = encoding, base_url = x$url,
  as_html = as_html)

default_encoding执行此操作:

default_encoding <- function(x) {
  type <- httr::headers(x)$`Content-Type`
  if (is.null(type)) return(NULL)

  media <- httr::parse_media(type)
  media$params$charset
}

但是rvest现在只公开read_xmlsession对象的response方法(它进行编码猜测)。

所以,你可以:

  • 在抓取之前(在阅读网站的ToS之后)进行一些手动内省,
  • 使用httr抓取页面并将其传递给read_xml
  • 使用相同的习惯用法将您自己的阅读器功能连接到您的脚本