Hpricot CSS Класс поиска - PullRequest
       11

Hpricot CSS Класс поиска

2 голосов
/ 13 июля 2009

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

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

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

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

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

Любая помощь высоко ценится. Спасибо

Ответы [ 3 ]

1 голос
/ 12 августа 2009

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

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

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

Однако при этом все равно возвращается массив, вначале содержащий все элементы div с классом 'first_class', за которыми следуют все элементы div с классом '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 голос
/ 13 июля 2009

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

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

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

doc.search("[@href][@type]")
0 голосов
/ 13 июля 2009

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

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

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

...