Nokogiri не извлекает страницу, он просит OpenURI сделать это с внутренним read
объектом StringIO, который возвращает Open :: URI.
require 'open-uri'
require 'zlib'
stream = open('http://en.wikipedia.org/wiki/France')
if (stream.content_encoding.empty?)
body = stream.read
else
body = Zlib::GzipReader.new(stream).read
end
p body
Вот что вы можете отключить:
>> require 'open-uri' #=> true
>> open('http://en.wikipedia.org/wiki/France').content_encoding #=> ["gzip"]
>> open('http://en.wikipedia.org/wiki/Thailand').content_encoding #=> []
В этом случае, если это []
, AKA "text / html", он читает.Если он ["gzip"]
, он декодируется.
Выполнение всего вышеперечисленного и добавление:
require 'nokogiri'
page = Nokogiri::HTML(body)
language_part = page.css('div#p-lang')
должно вернуть вас в нужное русло.
Сделайте это после всего вышеперечисленного, чтобы визуально подтвердить, что вы получаете что-то полезное:
p language_part.text.gsub("\t", '')
См. Ответ Каспера и комментарии о том, почему вы увидели два разных результата.Первоначально казалось, что Open-URI был непоследователен в обработке возвращаемых данных, но, основываясь на том, что сказал Каспер, и на том, что я видел с помощью curl, Wikipedia не учитывает заголовок «Accept-Encoding» для больших документов и возвращает gzip.Это довольно безопасно в современных браузерах, но такие клиенты, как Open-URI, которые автоматически не чувствуют кодирование, будут иметь проблемы.Вот что приведенный выше код должен помочь исправить.