nokogiri doc.xpath('head')返回nil

时间:2011-08-01 13:58:04

标签: ruby nokogiri

我正在尝试获取在给定html的head部分中声明的所有脚本,但无论我如何尝试,它总是返回nil。

doc = Nokogiri::HTML(open('http://www.walmart.com.br/'))

puts doc.at('body') # returns nill

doc.xpath('//html/head').each # this also will never iterate

有什么建议吗?

2 个答案:

答案 0 :(得分:7)

页面的DOCTYPE无效,因此Nokogiri不正确地解析页面。解决问题的快速,低效的解决方案:

require 'nokogiri'
require 'open-uri'
require 'pp'

# Request the HTML before parsing
html = open("http://www.walmart.com.br/").read

# Replace original DOCTYPE with a valid DOCTYPE
html = html.sub(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')

# Parse
doc = Nokogiri::HTML(html)

# Party.
pp doc.xpath("/html/head")

答案 1 :(得分:1)

好的,当我在脚本/控制台中尝试它时,我确实可以获得一些有用的东西:

doc.at('body')

所以我不确定那里有什么问题。

对于html头,我也无法获得头元素。 HTML工作正常,但无论如何都不会。

我觉得这个沃尔玛页面有点麻烦。我尝试为

做同样的事情
Nokogiri::HTML(open('http://google.com/')) 

它运作得很好。 因此,除非你能弄清楚他们正在做些什么来阻止你访问页面的某些部分...然后我不知道。

如果您可以处理文档中的所有脚本,我发现这个脚本运行正常:

doc.xpath('//script')