2014-10-01 5 views
1

Итак, я нахожусь в Италии, и играть с «лучшим фильмом» списком Оскару по IMDB в R. Выполнение этого кода:R htmlTreeParse частичного нежелательный перевода

library(XML) 
fileUrl <- "http://www.imdb.com/search/title?   
count=100&groups=oscar_best_picture_winners&sort=year%2Cdesc&ref_=nv_ch_osc_3" 
doc <- htmlTreeParse(fileUrl,useInternal=TRUE) 
scores <- xpathSApply(doc,"//td[@class='title']",xmlValue) 
head(scores,2) 

дает следующий результат:

[1] "\n \n\n\n\n 12 anni schiavo\n (2013)\n\n\n\n \n \n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n8.2/10\nX\n \n\n\nIn the antebellum United States, Solomon Northup, a free black man from upstate New York, is abducted and sold into slavery.\n\n Dir: Steve McQueen\n With: Chiwetel Ejiofor, Michael K. Williams, Michael Fassbender\n\n Biography | Drama | History\n \n 134 mins.\n"              
[2] "\n \n\n\n\n Argo\n (2012)\n\n\n\n \n \n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n7.8/10\nX\n \n\n\nActing under the cover of a Hollywood producer scouting a location for a science fiction film, a CIA agent launches a dangerous operation to rescue six Americans in Tehran during the U.S. hostage crisis in Iran in 1980.\n\n Dir: Ben Affleck\n With: Ben Affleck, Bryan Cranston, John Goodman\n\n Drama | Thriller\n \n 120 mins.\n" 
[3] "\n \n\n\n\n The Artist\n (2011)\n\n\n\n \n \n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n8.0/10\nX\n \n\n\nA silent movie star meets a young dancer, but the arrival of talking pictures sends their careers in opposite directions.\n\n Dir: Michel Hazanavicius\n With: Jean Dujardin, Bérénice Bejo, John Goodman\n\n Comedy | Drama | Romance\n \n 100 mins.\n"  

Проверьте первое поле после разрыва строки ... Обратите внимание, как для фильма 1 имя переводится на итальянский (английское название - «12 лет раба»), и все же для фильма 3 предоставляется только английский ? Fastforwarding немного, вот фрагмент кода дальше только, чтобы дать представление (промежуточные шаги пропущены):

> head(scores.df[,1],10) 
[1] "12 anni schiavo"     "Argo"        
[3] "The Artist"      "Il discorso del re"    
[5] "The Hurt Locker"     "The Millionaire"     
[7] "Non è un paese per vecchi"  "The Departed - Il bene e il male" 
[9] "Million Dollar Baby"    "Crash: Contatto fisico" 

я запустить веб-прокси, поэтому, естественно, когда я иду на сайт в Chrome это дает мне все английские, но даже в режиме инкогнито и Internet Explorer он дает все английские слова, так почему же он частично переводит некоторые из названий и как заставить его остановиться?

Спасибо!

+0

Значения, которые были проанализированы, отсутствуют в URL-адресе, который вы передаете парсеру? –

+0

Можете ли вы добавить URL-адрес вопроса? –

+0

Правильно, если я перейду к URL-адресу, я вижу все английские имена. URL был предоставлен в файлеUrl, поэтому 'http://www.imdb.com/search/title? count = 100 & groups = oscar_best_picture_winners & sort = year% 2Cdesc & ref_ = nv_ch_osc_3' –

ответ

5

Оказывается, хотя IMDB должен принимать какие-либо вопросы о вашем запросе на основе IP источника. Вероятно, вы настроили стандартную локаль в Chrome для запроса en-US версий страниц, или ваш прокси имеет более «английский» IP-адрес, однако механизм передачи файлов htmlTreeParse не использует тот же механизм для загрузки файлов. Я не вижу очевидного способа изменить заголовки, используемые библиотекой XML. Однако здесь есть версия, которая использует httr библиотеку, чтобы помочь с HTTP Request

library(XML) 
library(httr) 
fileUrl <- "http://www.imdb.com/search/title?count=100&groups=oscar_best_picture_winners&sort=year%2Cdesc&ref_=nv_ch_osc_3" 
en<-content(GET(fileUrl, add_headers("Accept-Language"="en-US;en"))) 
it<-content(GET(fileUrl, add_headers("Accept-Language"="it-it;it"))) 

Теперь мы можем сравнить результаты

head(xpathSApply(en,"//td[@class='title']//a[1]", xmlValue)) 
# [1] "12 Years a Slave" "Argo"    "The Artist"   
# [4] "The King's Speech" "The Hurt Locker"  "Slumdog Millionaire" 

head(xpathSApply(it,"//td[@class='title']//a[1]", xmlValue)) 
# [1] "12 anni schiavo" "Argo"    "The Artist"   
# [4] "Il discorso del re" "The Hurt Locker" "The Millionaire" 

Таким образом, мы можем видеть, что IMDB подчиняется запрашиваемым язык из заголовка запроса.

+0

Я не могу воспроизвести ваш пример ... что такое 'a [1]'? команда главы, когда вы предоставили им, возвращает NULL, и если я удалю '// a [1]', он возвращает пустой список. –

+0

@AmitKohli. Я завернул URL-адрес, чтобы он выглядел лучше, но если вы не удалили белый пространство, вы, вероятно, получите эту ошибку. Я удалил пробел из примера. Все 'a [1]' означает найти первый тег привязки ниже тега TD заголовка. Я просто использовал это, чтобы извлечь только имя. Вы можете использовать любой XPATH, который вы хотите. Это не важная часть. – MrFlick

+0

Я переустановил XML, и теперь я могу воспроизвести ваш пример ... это точно, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^