Ruby 打开uri+;hpricot&;nokogiri don';无法正确解析html

Ruby 打开uri+;hpricot&;nokogiri don';无法正确解析html,ruby,parsing,nokogiri,watir,open-uri,Ruby,Parsing,Nokogiri,Watir,Open Uri,我正在尝试使用openuri+hpricot解析一个网页,但在解析过程中似乎出现了问题,因为gems没有给我带来我想要的东西 具体来说,我想在这个url中获取这个div(其id是'pasajes'): 我写这段代码: require 'nokogiri' require 'hpricot' require 'open-uri' document = Hpricot(open('http://www.despegar.com.ar/')) # WITH HPRICOT document2 =

我正在尝试使用openuri+hpricot解析一个网页,但在解析过程中似乎出现了问题,因为gems没有给我带来我想要的东西

具体来说,我想在这个url中获取这个div(其id是'pasajes'):

我写这段代码:

require 'nokogiri'
require 'hpricot'
require 'open-uri'

document = Hpricot(open('http://www.despegar.com.ar/')) # WITH HPRICOT
document2 = Nokogiri::HTML(open('http://www.despegar.com.ar/')) # WITH NOKOGIRI

pasajes = document.search("//div[@id='pasajes']")
pasajes2 = document2.xpath("//div[@id='pasajes']")
但它什么也没带来!我在hpricot和nokogiri中尝试了很多东西:

  • 我试着给出那个div的绝对路径
  • 我用选择器尝试CSS路径
  • 我尝试使用hpricot搜索快捷方式(doc/“div#pasajes”)
  • 几乎所有可能的相对路径都可以到达“pasajes”分区
  • 最后我找到了一个可怕的解决办法。我使用了watir库,打开web浏览器后,我将html传递给hpricot。通过这种方式,hpricot确实可以识别“pasajes”div。但我不想仅仅为了解析目的而打开web浏览器


    我做错了什么?开放uri工作不好吗?是hpricot吗?

    该页面中没有id为“pasajes”的div。这就是问题所在。

    静态HTML页面中没有id为pasajes的DIV。如果您正在运行*nix,您可以通过执行以下操作看到:

    curl http://www.despegar.com.ar/ | grep pasajes
    
    我猜它是由JavaScript生成的


    如果你正在使用MacRuby,你可以试试。

    这更适合作为对乔纳斯上述答案的补充评论,而不是答案本身。。。但我对SO还不熟悉,还没有“评论权”:

    您可以使用Selenium RC下载完整的HTML,然后在下载的文件上使用nokogiri。注意,只有当内容由Javascript生成/修改时,这才有效。如果网页依赖cookies来设置内容,您可以选择Selenium(在浏览器中)或watir(如您所述)


    我很想听到一个更好的解决方案(想用nokogiri解析网页,但页面是由JS修改的)

    我在Nokogiri上遇到了类似的问题,但是在OS X 10.5上。然而,我首先尝试打开uri来打开有很多HTML div的页面。我发现通过使用:

    urldoc = open('http://hivelogic.com/articles/using_usr_local')
    urldoc.readlines{|line| puts line}
    
    我会看到很多精彩的HTML。我还发现,通过将“文件”读入字符串并将其传递给Nokogiri,我可以使其正常工作。我甚至不得不修改他们在rubyforge上使用的演示来教你关于Nokogiri的知识

    通过他们自己的例子,我得出以下结论:

    >> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))
    => <!DOCTYPE html>
    
    >> doc.children
    => 
    
    doc=Nokogiri::HTML(打开http://www.google.com/search?q=tenderlove')) => >>儿童医生 => 恶心

    如果我将url读入字符串,我会得到一些好东西:

    >> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove').read)
    => <!DOCTYPE html>
    <html>
    <head>
    ..... TONS OF HTML HERE ........
    </div>
    </body>
    </html>
    
    doc=Nokogiri::HTML(打开http://www.google.com/search?q=tenderlove)。阅读) => ..... 这里有大量的HTML。。。。。。。。 注意 当我使用irb播放时,我确实看到了这个可爱的警告:

    嗨。您使用的是libxml2版本2.6.16,该版本已有4年历史,并且 很多虫子。我们建议,为了获得最大的HTML/XML解析乐趣,您可以 升级您的libxml2版本并重新安装nokogiri。如果你喜欢使用 libxml2版本2.6.16,但不喜欢此警告,请定义常量 在要求nokogiri之前,我知道我正在使用旧版和小车版的LIBXML2

    但我没有心情去处理这些恐怖事件和各种专家的建议,但却与在/usr/local中修复libxml的建议相矛盾。一篇博文对此有很好的解释,但是另一个*nix向导用一些合理的警告和担忧来攻击这个概念。所以我说,“不可能”

    我为什么要写这个?因为在我看来,我的Nokogiri忧郁和libxml警告之间可能有联系。OSX10.5是旧版本的,他们可能会有问题

    问题


    是否有其他OS X 10.5用户对Nokogiri有此问题?

    啊,这可能就是问题所在。不管怎么说,要解析它吗?或者瓦蒂尔将是我唯一的选择?谢谢,我不是在跑步。我使用的是windows xp。使用firebug或ie开发者工具栏或在firefox中使用“查看源代码可以”我可以看到“pasajes”div。为什么你说没有div“pasajes”div?在静态页面中没有div,它是用JavaScript放在那里的。我开始对此感到不安。您能解释一下为什么要监控despegars的报价吗?我怎么能看到没有id为“pasajes”的div。查看源代码时,我可以找到具有该id的div。我不明白您为什么说该div不存在。。。谢谢如果我尝试使用firefox查看源代码,它没有具有该id的div。div在哪一行?好的,我设法让它显示出来。该网站根据一些cookie/国家/事物修改其内容。这就是为什么它可能会在浏览器中显示,但不会在python中显示。您可以尝试跟踪导致修改内容的原因,然后配置脚本以重复它。这可能是一些cookie,下面是关于如何将cookie与python和http结合使用的说明。