2

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

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

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

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

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

非常感谢任何帮助。谢谢

4

3 回答 3

1

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

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

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

doc.search("[@href][@type]")
于 2009-07-13T01:02:46.830 回答
1

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

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

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']")
于 2009-08-11T22:45:22.563 回答
0

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

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

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

于 2009-07-13T12:45:04.637 回答