我正在构建一个脚本来解析多个页面标题。感谢堆栈中的另一个问题,我现在有了这个工作位
curl = %x(curl http://odin.1.ai)
simian = curl.match(/<title>(.*)<\/title>/)[1]
puts simian
但是如果您尝试相同的页面没有标题,例如
curl = %x(curl http://zales.1.ai)
它因 nill 类的未定义方法而死,因为它没有标题....我无法检查 curl 是否为 nil,因为在这种情况下它不是(它包含另一行)
即使标题不存在并移至下一页进行检查,您是否有任何解决方案可以使其正常工作?如果我们坚持使用此代码,我将不胜感激,因为我确实尝试过使用 nokogiri 和 uri 的其他解决方案 (Nokogiri::HTML(open("http:/.....") 但这也不能像 byname_meee.1 这样的子域工作.ai 不适用于默认的 open-uri,所以如果我们能坚持使用 curl 的代码,我将不胜感激。
更新
我意识到我可能遗漏了一些应该澄清的具体案例。这是为了解析 300-400 页。在第一次运行中,我注意到至少有两种情况,其中 nokogiri、hpricot 甚至更基本的 open-uri 都不起作用
1) open-uri 在一个简单的域中就失败了,像http://levant_alejandro.1.ai这是一个有效的域,并且可以与 curl 一起使用,但不能与 open_uri 或 nokogiri 一起使用 open_uri
2)第二种情况,如果页面没有像 http://zales.1.ai这样的标题
3) 第三个是一个带有图像的页面,没有像http://voldemortas.1.ai/这样的有效 HTML
第四种情况是页面只有内部服务器错误或乘客/机架错误。
可以使用此解决方案对前三个案例进行排序(感谢 #ruby IRC 频道中的 Havenwood)
curl = %x(curl http://voldemortas.1.ai/)
begin
simian = curl.match(/<title>(.*)<\/title>/)[1]
rescue NoMethodError
simian = "" # curl was nil?
rescue ArguementError
simian = "" # not html?
end
puts simian
现在我知道这既不优雅也不最优。
改写的问题
你有没有更好的方法来使用 nokogiri 或其他包含这些情况的 gem(没有标题或没有 HTML 有效页面甚至 404 页面)?鉴于我正在解析的页面具有相当简单的标题结构,上述解决方案是否合适?为了了解知识,了解为什么使用像 nokogiri 这样的额外 gem 进行解析会是更好的选择(注意:我尝试很少有 gem 依赖项,因为它们往往会随着时间的推移而破坏)。