我正在尝试获取在给定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
有什么建议吗?
答案 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')