2009-07-12 2 views
2

Я работаю над некоторым кодом, который очищает страницу для двух классов css на странице. Я просто с помощью метода поиска Hpricot для этого, как так:Hpricot CSS Поиск по классам

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

... для каждого элемента нашел я создать объект и поместить его в массив, это прекрасно работает за исключением одной вещи.

Поиск будет проходить через всю страницу html и добавлять объект в массив каждый раз, когда он встречается с «.first_class», а затем он снова просматривает документ в поисках «.second_class», в результате чего получается конечный массив содержащий все найденные элементы в неправильном порядке в массиве, то есть все объекты .first_class, за которыми следуют все объекты .second_class.

Есть ли способ, которым я могу заставить это искать документ за один раз и добавлять объект в массив каждый раз, когда он сталкивается с одним из указанных классов, предоставляя мне массив элементов, который находится в том порядке, в котором они находятся натолкнулся на страницу, которую я соскабливаю?

Любая помощь очень ценится. Благодаря

ответ

1

Хорошо, так получилось, я ошибся, и это не изменило того, что я раньше имел. Тем не менее, я придумал решение, потому что он наиболее подходит или нет, я не уверен. Однако, похоже, это довольно прямолинейно для раздражающей проблемы.

я теперь выполнить поиск для двух классов выше, как я уже упоминалось выше:

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

Однако это по-прежнему возвращается массив, во-первых, содержащий все дивы с классом «first_class» следуют все дивы с класс «second_class». Поэтому, чтобы исправить это и получить массив всех элементов по мере их появления на странице, я просто привязываю метод «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']") 
1

Смотрите раздел здесь на «Проверка на несколько атрибутов»:

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

Вы должны быть в состоянии складывать элементы таким же образом, как вы делаете атрибуты. Эта функция, по-видимому, возможна в версиях Hpricot после 2006 года 17 марта. Пример с элементами:

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

Спасибо за отзыв. Я не заметил этого в документации, а также нашел другую страницу, которую я тоже не видел. Я установил это с помощью следующей строки:

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

Это теперь добавляет объект в массив каждый раз, когда он приходит по одному из вышеуказанных классов в документе. Brilliant!

Смежные вопросы