gpt4 book ai didi

ruby - 为什么 Nokogiri 不加载整个页面?

转载 作者:数据小太阳 更新时间:2023-10-29 08:19:07 24 4
gpt4 key购买 nike

我正在使用 Nokogiri 打开有关各个国家/地区的维基百科页面,然后从维基间链接(指向外语维基百科的链接)中提取这些国家/地区的其他语言名称。但是,当我尝试打开 the page for France , 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')

测试:

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

也许这个问题超出了 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

以下是您可以关闭的内容:

>> require 'open-uri' #=> true
>> open('http://en.wikipedia.org/wiki/France').content_encoding #=> ["gzip"]
>> open('http://en.wikipedia.org/wiki/Thailand').content_encoding #=> []

在这种情况下,如果它是 [],又名“text/html”,它会读取。如果是 ["gzip"],它会解码。

完成上述所有工作并将其扔到:

require 'nokogiri'
page = Nokogiri::HTML(body)
language_part = page.css('div#p-lang')

应该能让你重回正轨。

在完成上述所有操作之后执行此操作以在视觉上确认您获得了可用的东西:

p language_part.text.gsub("\t", '')

请参阅 Casper 的回答和评论,了解为什么您会看到两个不同的结果。最初看起来 Open-URI 在处理返回数据时不一致,但根据 Casper 所说的以及我使用 curl 看到的情况,维基百科不尊重大型文档的“Accept-Encoding” header 并返回 gzip。这对于今天的浏览器来说是相当安全的,但是像 Open-URI 这样不能自动感知编码的客户端将会有问题。这就是上面的代码应该有助于解决的问题。

关于ruby - 为什么 Nokogiri 不加载整个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6558309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com