2014-11-30 5 views
0

저는 R 스크립트에서 Twitter REST API 1.1 (user_timeline.json)으로 작업하고 있습니다. 트윗을 대량으로 수집합니다.JSON API 출력이 유효하도록 특수 문자를 바꿉니다.

불행히도 텍스트에는 \n, ^ 또는 \과 같은 많은 특수 문자가 포함되어 있습니다. 지금까지, 나는 fromJSON (jsonlite 패키지)를 통해 가져 오기 전에 str_replace_all 또는 GSUB로 교체 할 수 있었다 :

correctJSON <- function(string) { 
    string <- str_replace_all(string, pattern = perl('\\\\(?![tn"])'), replacement = " ") 
    string <- str_replace_all(string, pattern = "\n", replacement = " ") 
    string <- str_replace_all(string, pattern = "\r", replacement = " ") 
    string <- str_replace_all(string, pattern = "\\^", replacement = " ") 
    return(string) 
} 

가 지금은 \xed 또는 \xa0 같은 특수 문자가 포함 된 문자열을 가지고있다.

Fehler in parseJSON(txt) : lexical error: invalid bytes in UTF8 string. 
     uch sind.Mutig von bd. Seiten������������������������������� 
       (right here) ------^ 

문제가있는 문자가 포함 된 트윗은 AFAICS입니다 : (fromJSON(correctJSON(string))를 통해) 가져하려고 할 때, 나는 correctJSON 기능의 오류로 얻을 이미 많은 것들을 시도

[{\"created_at\":\"Fri Feb 07 18:35:02 +0000 2014\",\"id\":431858659656990721,\"id_str\":\"431858659656990721\",\"text\":\"RT @FHubersr: @peteraltmaier //die Schwarz-Grünen werden zeigen, daß sich Ökologie und Ökonomie vertragen und kein Widerspruch sind.Mutig v…\",\"source\":\"<a href=\\\"http://twitter.com/download/iphone\\\" rel=\\\"nofollow\\\">Twitter for iPhone</a>\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":378693834,\"id_str\":\"378693834\"},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweeted_status\":{\"created_at\":\"Fri Feb 07 18:32:30 +0000 2014\",\"id\":431858022366064640,\"id_str\":\"431858022366064640\",\"text\":\"@peteraltmaier //die Schwarz-Grünen werden zeigen, daß sich Ökologie und Ökonomie vertragen und kein Widerspruch sind.Mutig von bd. Seiten\xed\xa0\xbd\xed\xb1\x8d\xed\xa0\xbd\xed\xb8\x8e\",\"source\":\"<a href=\\\"http://twitter.com/download/iphone\\\" rel=\\\"nofollow\\\">Twitter for iPhone</a>\",\"truncated\":false,\"in_reply_to_status_id\":431845492579123201,\"in_reply_to_status_id_str\":\"431845492579123201\",\"in_reply_to_user_id\":378693834,\"in_reply_to_user_id_str\":\"378693834\",\"in_reply_to_screen_name\":\"peteraltmaier\",\"user\":{\"id\":2172292811,\"id_str\":\"2172292811\"},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweet_count\":3,\"favorite_count\":4,\"favorited\":false,\"retweeted\":false,\"lang\":\"de\"},\"retweet_count\":3,\"favorite_count\":0,\"favorited\":false,\"retweeted\":false,\"lang\":\"de\"}] 

하지만 일부 스레드를 읽은 후에도 모든 문제가있는 특수 문자를 대체 할 수있는 솔루션을 찾을 수 없습니다.

참고 : fromJSON을 통해 단일 트윗을 가져 오려는 경우 오류가 발생하지 않습니다. 그러나 올바른 JSON 문자열을 가져 오면 오류가 발생합니다. 하지만 정확한 JSON을 필요로하기 때문에 많은 \ n 출연 ...

추 신 : 문제가있는 트윗 만 붙였습니다. 여기에 내 API 호출의 전체 출력이 표시됩니다. https://p.mehl.mx/?53c04753c247a48a#5w+HtSCYpcjRwSk0PdsP3P1w3u+Z22/f6GKMJRoW//8=

감사합니다.

+0

이 문자들은'\ xed \ xa0' ...로 출력됩니까? – hwnd

+0

예, 그렇습니다. 이를 명확히하기 위해 관련 항목이있는 RData 파일을 업로드했습니다. 'current'는 내 Twitter API 호출 (> 100 트윗)의 직접 출력을 포함합니다 : http://up.mehl.mx/dl/twitter-api.RData 추가 정보 : 저는 최신 RStudio를 데비안 Sid에서 사용하고 있습니다. amd64. – mxmehl

답변

0

좋아, 나는 가능한이 지금까지 수집 된 최초의 5,000 트윗 작동하는 자신을 대답 발견

correctJSON <- function(string) { 
    string <- str_replace_all(string, pattern = "[^[:print:]]", replacement = " ") 
    string <- str_replace_all(string, pattern = perl('\\\\(?![tn"])'), replacement = " ") 
    return(string) 
} 

정규식 [^[:print:]]\xed, \n 어쩌면 또한 \U.... 같은 특수 문자에 적합합니다. 단일 \에 대해서만 두 번째 (펄) 정규식이 필요합니다.

그래서 지금은 잘될뿐만 아니라 앞으로 가져올 많은 트윗에 대해서도 잘 작동합니다. 예상치 못한 일이 발생하면 수정하겠습니다.

관련 문제