open-uri + hpricot& nokogiri没有正确解析HTML

时间:2009-08-31 14:30:13

标签: ruby parsing nokogiri watir open-uri

我正在尝试使用open-uri + hpricot解析一个网页,但这似乎是解析过程中的一个问题,因为宝石没有给我带来我想要的东西。

具体来说,我希望在此网址中获得 div (其ID为'pasajes'):

http://www.despegar.com.ar

我写这段代码:

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都尝试过很多东西:

  1. 我尝试给出div的绝对路径
  2. 我尝试使用选择器的CSS路径
  3. 我尝试使用hpricot搜索快捷方式(doc //“div#pasajes”)
  4. 几乎所有可以到达'pasajes'div的相对路径
  5. 最后我发现了一个可怕的解决方案。我使用了watir库,打开网页浏览器之后,我已经将html传递给了hpricot。通过这种方式hpricot DO RECOGNIZE'pasajes'div。但我不想只是为了解析而打开一个web-browsere ...

    我做错了什么? open-uri工作不好吗?是hpricot吗?

4 个答案:

答案 0 :(得分:4)

静态HTML页面中没有带有id pasajes的DIV。如果你正在运行* nix,你可以看到:

curl http://www.despegar.com.ar/ | grep pasajes

我的猜测是它是由JavaScript生成的。

如果您使用的是MacRuby,可以试试Lyndon

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这更像是对Jonas上面回答的补充评论,而不仅仅是答案......但我是SO的新手,还没有“评论能力”:)

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

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

答案 3 :(得分:1)

我遇到了与Nokogiri类似的问题,但是在OS X 10.5上。但是,我首先尝试使用open-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
=> 

YUCK!

如果我调整将url读入字符串,我会得到很好的东西:

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove').read)
=> <!DOCTYPE html>
<html>
<head>
..... TONS OF HTML HERE ........
</div>
</body>
</html>

注意 当我使用irb来玩时,我确实看到了这个可爱的警告:

  

HI。您正在使用已超过4年的libxml2版本2.6.16   很多错误。我们建议您最大限度地提高HTML / XML解析的乐趣   升级您的libxml2版本并重新安装nokogiri。如果你喜欢使用   libxml2版本2.6.16,但不喜欢这个警告,请定义常量   在要求nokogiri之前的I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2。

但是我没有心情去处理在/ usr / local blah blah中修复libxml的恐怖和各种专家但有矛盾的建议。 link text上的帖子对它有一个很好的解释,但是另一个* nix向导用一些声音警告和关注来攻击这个概念。所以我说,“没办法”。

为什么要写这个?因为IMO我认为我的Nokogiri蓝调和libxml警告之间可能存在联系。 OS X 10.5是旧的东西,他们可能有问题。

<强>问题

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