Hpricot CSS Класс поиска
Я работаю над кодом, который очищает страницу для двух классов CSS на странице. Для этого я просто использую метод поиска Hpricot:
webpage.search("body").search("div.first_class | div.second_class")
... для каждого найденного элемента я создаю объект и помещаю его в массив, это прекрасно работает, за исключением одной вещи.
Поиск будет проходить по всей html-странице и добавлять объект в массив каждый раз, когда он сталкивается с ".first_class", а затем он снова просматривает документ в поисках ".second_class", в результате чего в конечном массиве содержатся все выполнял поиск элементов в неправильном порядке в массиве, то есть всех объектов ".first_class", за которыми следовали все объекты ".second_class".
Есть ли способ заставить это искать документ за один раз и добавлять объект в массив каждый раз, когда он сталкивается с одним из указанных классов, давая мне массив элементов в том порядке, в котором они встречаются на страницу, которую я скребу?
Любая помощь высоко ценится. Спасибо
3 ответа
Итак, оказалось, что я ошибся, и это не сделало ничего, что было раньше. Тем не менее, я придумала решение, является ли оно наиболее подходящим или нет, я не уверен. Похоже, довольно прямо вперед для раздражающей проблемы, хотя.
Теперь я выполняю поиск двух классов выше, как я уже упоминал выше:
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']")
См. Раздел здесь "Проверка нескольких атрибутов":
http://wiki.github.com/why/hpricot/hpricot-challenge
Вы должны иметь возможность складывать элементы так же, как вы делаете атрибуты. Эта возможность, по-видимому, возможна в версиях Hpricot после 2006 года 17 марта... Пример с элементами:
doc.search("[@href][@type]")
Спасибо за чаевые. Я не заметил этого в документации, а также нашел другую страницу, которую тоже не видел. Я исправил это с помощью следующей строки:
webpage.search("body").search("[@class~='first_class']|[@class~='second_class']")
Теперь это добавляет объект в массив каждый раз, когда он сталкивается с одним из вышеуказанных классов в документе. Brilliant!