Пересечение Элемент Hpricot - PullRequest
1 голос
/ 29 июня 2009

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 29 июня 2009
>> 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"}]

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

2 голосов
/ 29 июня 2009

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

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

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

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

...