2

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

具体来说,我想在此 url中获取此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

最后我找到了一个可怕的解决方案。我使用了 watir 库,打开网络浏览器后,我将 html 传递给了 hpricot。以这种方式 hpricot 可以识别 'pasajes' div。但我不想仅仅为了解析目的而打开一个网络浏览器......

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

4

4 回答 4

4

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

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

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

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

于 2009-08-31T14:40:29.983 回答
3

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

于 2009-08-31T14:38:52.607 回答
1

这更适合作为对以上乔纳斯答案的附加评论,而不是本身的答案......但我是新来的,还没有“评论权”:)

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

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

于 2009-09-03T07:04:48.470 回答
1

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

urldoc = open('http://hivelogic.com/articles/using_usr_local')
urldoc.readlines{|line| puts line}

我会看到很多精彩的 HTML。我还发现,通过将“文件”读入字符串并将其传递给 Nokogiri,我可以让它正常工作。我什至不得不修改他们在 ruby​​forge 上使用的演示来教你关于 Nokogiri 的知识。

使用他们自己的例子,我得到了这个:

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))
=> <!DOCTYPE html>

>> doc.children
=> 

呸!

如果我调整以将 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 播放时,我确实看到了这个可爱的警告:

你好。您使用的 libxml2 版本 2.6.16 已经超过 4 年并且有很多错误。我们建议您为了获得最大的 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 的建议相矛盾。链接文本上的帖子对此进行了很好的解释,但随后另一个 *nix 向导用一些声音警告和担忧攻击了这个概念。所以我说,“没办法”。

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

问题

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

于 2009-10-10T18:41:38.660 回答