我正在编写一些代码,用于在一个页面上抓取两个css类的页面。我只是简单地使用Hpricot搜索方法来实现:
webpage.search("body").search("div.first_class | div.second_class")...for找到的每一项,我都创建了一个对象,并将其放入一个数组中,这很好用,除了一件事。
搜索将遍历整个html页面,并在每次遇到“.first_class”时将一个对象添加到一个数组中,然后它将再次遍历文档以查找“.Second_class”,导致最终的数组包含所有搜索项在数组中的顺序不正确,即所有的“.first_class”对象,后跟所有的“.second_class”对象。
有没有一种方法可以让我一次性搜索文档,并在每次遇到指定的类时将一个对象添加到数组中,给我一个项目数组,该数组按照项目在我抓取的页面上的顺序排列?
任何帮助都非常感谢。谢谢
发布于 2009-08-11 22:45:23
好了,事实证明我错了,这和我之前做的没有任何不同。然而,我已经想出了一个解决方案,我不确定这是不是最合适的。然而,对于一个恼人的问题,这似乎是一个相当直接的问题。
我现在执行上面提到的两个类的搜索:
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-07-13 01:02:47
请参阅这里的“检查几个属性”部分:
http://wiki.github.com/why/hpricot/hpricot-challenge
您应该能够以与处理属性相同的方式堆叠元素。在2006年3月17日之后的Hpricot版本中,此功能显然是可能的。以下是包含元素的示例:
doc.search("[@href][@type]")发布于 2009-07-13 12:45:05
谢谢你告诉我。我没有在文档中发现这一点,还发现了另一个我也没有看过的页面。我已经用下面的代码行修复了这个问题:
webpage.search("body").search("[@class~='first_class']|[@class~='second_class']")现在,每当它遇到文档中的上述类之一时,都会向数组中添加一个对象。非常出色!
https://stackoverflow.com/questions/1117079
复制相似问题