这是我的代码,我有一个在 UTF8 中转换的查询,但最后我收到一个错误,该查询不是 UTF8 我无法修复它:
library("XML")
library("methods")
library("httr")
query = http://export.arxiv.org/api/query?search_query=(au:( "Benoit Bertrand"))&start=0&max_results=2000
xml_data = xmlToList(iconv(URLencode(query),to="UTF-8"))
错误:1:输入的 UTF-8 不正确,指示编码!
字节: 0xC9 0x70 0x69 0x6A
我发现这是导致代码崩溃的空格字符,但这就是我得到的全部
由于拼写错误,问题的代码无法编译。即使修复了这些错误,代码也不会做一些有用的事情 -xmlToList
应用于URL,而不是 GET 请求的结果。这足以生成错误:
query<-"http://export.arxiv.org/api/query?search_query=(au:( "Benoit Bertrand"))&start=0&max_results=2000"
xmlToList(query)
再多的 URL 编码和转换也无法解决这个问题。也不需要转换,因为 URL 在 US-ASCII 范围内。在该范围内,UTF8 字符串与 ASCII 字符串无法区分。
获取和解析此Arxiv页面的正确代码是:
//Just a URL
query<-"http://export.arxiv.org/api/query?search_query=(au:( "Benoit Bertrand"))&start=0&max_results=2000"
//Get the contents
r <- GET(query)
//Extract the text from the response
xml<-content(r, "text")
//Read as lists
l<-xmlToList(xml)
响应r
不仅仅是一个字符串,它是一个包含标头(包括编码(、响应状态和响应内容的对象。其中一个标头是内容类型:
> r
Response [http://export.arxiv.org/api/query?search_query=(au:( "Benoit Bertrand"))&start=0&max_results=2000]
Date: 2019-09-30 12:54
Status: 200
Content-Type: application/atom+xml; charset=UTF-8
Size: 786 B
content(r, "text")
使用该标头中存储的编码将内容转换为文本。
之后,xmlToList
可以解析 XML 字符串