我正在编写一个仅供使用的应用程序。在这个应用程序中,我将URL放在经典的POST形式中,从中提取一些信息。例如,这一行是我提取页面标题的地方:
self.name = Nokogiri::HTML(open(self.url)).css('title').to_s.sub('<title>','').to_s.sub('</title>','')
我使用Nokogiri(v1.5.4)来解析源页面中的数据。我不知道我是否遗漏了什么,但应用程序的行为很奇怪。
如果我在我的机器上的开发环境中在本地主机上运行,那么一切都能正常工作,在我看来也没问题。但是,在推动Heroku之后,出现了一些问题。例如,来自StackOverflow的URL总是有这种类型的错误:
OpenURI::HTTPError (503 Service Unavailable):
app/models/url.rb:67:in `set_name'
app/controllers/urls_controller.rb:48:in `block in create'
app/controllers/urls_controller.rb:46:in `create'
我不明白为什么它只发生在赫鲁库。在我的本地机器上,它可以完美地使用相同的URL。我可能在Heroku上遗漏了一些东西,但其他URL正在返回正常的200状态,并且运行良好。它只是来自StackOverflow的URL。
不要使用:
.to_s.sub('<title>','').to_s.sub('</title>','')
改为使用:
.text
例如:
html = '<head><title>foo</title></head>'
Nokogiri::HTML(html).css('title').text
在IRB:
irb(main):055:0> html = '<head><title>foo</title></head>'
"<head><title>foo</title></head>"
irb(main):056:0> Nokogiri::HTML(html).css('title').text
"foo"
为什么StackOverflow的URL在Heroku上失败并出现503可能是路由或托管问题,因为你得到的是503。
与其刮页,不如考虑";Stack Overflow的公共数据转储在哪里"以及";堆栈溢出知识共享数据转储";。