Spr*_*ofi 2 ruby open-uri nokogiri
我正在使用Nokogiri打开关于各个国家的维基百科页面,然后从interwiki链接中提取其他语言的这些国家的名称(链接到外语wikipedias).但是,当我尝试打开法国页面时,Nokogiri不会下载整页.也许它太大了,无论如何它不包含我需要的interwiki链接.我怎么强迫它下载所有?
这是我的代码:
url = "http://en.wikipedia.org/wiki/" + country_name
page = nil
begin
page = Nokogiri::HTML(open(url))
rescue OpenURI::HTTPError=>e
puts "No article found for " + country_name
end
language_part = page.css('div#p-lang')
Run Code Online (Sandbox Code Playgroud)
测试:
with country_name = "France"
=> []
with country_name = "Thailand"
=> really long array that I don't want to quote here,
but containing all the right data
Run Code Online (Sandbox Code Playgroud)
也许这个问题超越了Nokogiri并进入OpenURI - 无论如何我需要找到一个解决方案.
Nokogiri没有检索页面,它要求OpenURI使用read
Open :: URI返回的StringIO对象的内部函数来执行此操作.
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
Run Code Online (Sandbox Code Playgroud)
以下是您可以关键的内容:
>> require 'open-uri' #=> true
>> open('http://en.wikipedia.org/wiki/France').content_encoding #=> ["gzip"]
>> open('http://en.wikipedia.org/wiki/Thailand').content_encoding #=> []
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果是[]
,AKA"text/html",它会读取.如果它是["gzip"]
解码.
做上面的所有事情并将其扔到:
require 'nokogiri'
page = Nokogiri::HTML(body)
language_part = page.css('div#p-lang')
Run Code Online (Sandbox Code Playgroud)
应该让你回到正轨.
在完成上述所有操作后执行此操作以确认您可以获得可用的内容:
p language_part.text.gsub("\t", '')
Run Code Online (Sandbox Code Playgroud)
请参阅Casper的回答和评论为什么您看到两个不同的结果.最初看起来Open-URI在处理返回数据方面不一致,但根据Casper的说法,以及我使用curl看到的内容,维基百科并没有尊重大型文档的"Accept-Encoding"标头并返回gzip.对于今天的浏览器来说这是相当安全的,但是像Open-URI这样不会自动检测编码的客户端会遇到问题.这就是上面的代码应该有助于解决的问题.
归档时间: |
|
查看次数: |
2758 次 |
最近记录: |