Пересечение элемента Hpricot

Я хочу удалить все изображения с HTML-страницы (фактически пользовательский ввод tinymce), которые не соответствуют определенным критериям (класс = "int" или класс = "ext"), и я борюсь с правильным подходом. Вот что я делаю до сих пор:

hbody = Hpricot(input)
@internal_images = hbody.search("//img[@class='int']")
@external_images = hbody.search("//img[@class='ext']")

Но я не знаю, как найти изображения, где класс имеет неправильное значение (не «int» или «ext»).

Мне также приходится перебирать элементы, чтобы проверять другие атрибуты, которые не являются стандартными html (я использую их для установки внутренних значений, таких как идентификатор БД, который я устанавливаю в атрибуте dbsrc). Могу ли я также получить доступ к этим атрибутам и есть ли способ удалить определенные элементы (которые находятся в результатах поиска hpricot), если они не соответствуют моим критериям?

Спасибо за вашу помощь!


person Ole Spaarmann    schedule 29.06.2009    source источник


Ответы (2)


>> doc = Hpricot.parse('<html><img src="foo" class="int" /><img src="bar" bar="42" /><img src="foobar" class="int"></html>')
=> #<Hpricot::Doc {elem <html> {emptyelem <img class="int" src="foo">} {emptyelem <img src="bar" bar="42">} {emptyelem <img class="int" src="foobar">} </html>}>
>> doc.search("img")[1][:bar]
=> "42"
>> doc.search("img") - doc.search("img.int")
=> [{emptyelem img src"bar" bar"42"}]

Получив результаты поиска, вы можете использовать обычные операции с массивами. нестандартные атрибуты доступны через [].

person Ben Hughes    schedule 29.06.2009
comment
вау, довольно просто, поэтому я могу использовать collection_one - collection_two, чтобы удалить все элементы из collection_one, которые находятся в collection_two? Спасибо! - person Ole Spaarmann; 29.06.2009
comment
Важное примечание: после z = x - y x не изменится, z просто будет содержать все x, которых нет в y. - person rampion; 29.06.2009
comment
да, и + для добавления коллекций, например. all_images - (internal_images + external_images). - person Ben Hughes; 29.06.2009

Проверьте не CSS-селектор.

(hbody."img:not(.int)")
(hbody."img:not(.ext)")

К сожалению, не похоже, что вы можете конкатировать не выражения. Возможно, вы захотите получить все узлы img и удалить те, в которых селектор .css не включает ни .int, ни .ext. Кроме того, вы можете использовать оператор разницы, чтобы вычислить, какие элементы не являются частью обеих коллекций.

Используйте метод .remove для удаления узлов или элементов: документация Hpricot Altering.

person Simone Carletti    schedule 29.06.2009
comment
Наконец-то я смог добиться того, чего хотел, объединив поиск: hbody.search(img).search(:not(.int)).search(:not(.ext)) возвращает все изображения, где класс не int и не ext . После их удаления я могу проверить другие атрибуты и сделать в основном то же самое. Еще раз спасибо! - person Ole Spaarmann; 29.06.2009