【问题标题】:Hpricot CSS Class searchHpricot CSS 类搜索
【发布时间】:2009-07-12 22:17:55
【问题描述】:

我正在编写一些代码,用于为页面上的两个 css 类抓取页面。我只是这样使用 Hpricot 搜索方法:

webpage.search("body").search("div.first_class | div.second_class")

...对于找到的每个项目,我创建一个对象并将其放入一个数组中,这很好用,除了一件事。

搜索将遍历整个 html 页面,并在每次遇到“.first_class”时将一个对象添加到一个数组中,然后它会再次遍历文档寻找“.second_class”,最终的数组包含所有在数组中以错误顺序搜索的项目,即所有“.first_class”对象,然后是所有“.second_class”对象。

有没有一种方法可以让我一次性搜索文档并在每次遇到一个指定的类时将一个对象添加到数组中,从而为我提供一个按顺序排列的项目数组在我正在抓取的页面上?

非常感谢任何帮助。谢谢

【问题讨论】:

    标签: ruby-on-rails ruby arrays search hpricot


    【解决方案1】:

    请参阅此处的“检查一些属性”部分:

    http://wiki.github.com/why/hpricot/hpricot-challenge

    您应该能够以与属性相同的方式堆叠元素。在 2006 年 3 月 17 日之后的 Hpricot 版本中,这个功能显然是可能的......元素的一个例子是:

    doc.search("[@href][@type]")
    

    【讨论】:

      【解决方案2】:

      好吧,事实证明我错了,这与我之前的做法没有任何不同。但是,我想出了一个解决方案,它是否最合适我不确定。不过,对于一个烦人的问题来说,这似乎是一个相当直接的问题。

      我现在执行上面提到的两个类的搜索:

      webpage.search("body").search("[@class~='first_class']|[@class~='second_class']")
      

      但是这仍然返回一个数组,首先包含所有具有“first_class”类的 div,然后是所有具有“second_class”类的 div。因此,要解决此问题并获取所有项目的数组,因为它们按顺序显示在页面上,我只需将“add_class”方法与我自己的自定义类链接起来,例如'foo_bar'。然后,这允许我在页面上执行另一次搜索,以仅使用这个标签对所有 div 进行搜索,从而按照它们在页面上出现的顺序返回我所追求的所有项目的数组。

      webpage.search("body").search("[@class~='first_class']|[@class~='second_class']").add_class("foo_bar")
      
      webpage.search("body").search("[@class~='foo_bar']")
      

      【讨论】:

        【解决方案3】:

        感谢您的提示。我没有在文档中发现这一点,也发现了另一个我也没有看到的页面。我已经用以下行解决了这个问题:

        webpage.search("body").search("[@class~='first_class']|[@class~='second_class']")
        

        现在每次遇到文档中的上述类之一时,都会将一个对象添加到数组中。太棒了!

        【讨论】:

          猜你喜欢
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          相关资源
          最近更新 更多