nokogiri исключил элементы из списка избранных - PullRequest
0 голосов
/ 18 августа 2011

Я просто пытаюсь исключить пару дочерних элементов по классу из выбора всех дочерних элементов узла

page.css('div.parent > *').each do |child|
  if (child["class"].content != 'this' && child["class"].content != 'that')
    array.push(child.text.to_s)
  end
end 

Я знаю, что это не синтаксис записи, но не смог найтикак выбрать класс элементов, в отличие от выбора и элемента от класса.

1 Ответ

1 голос
/ 18 августа 2011

Метод css дает вам Nokogiri::XML::Element экземпляров, и большинство из них получают свое поведение из родительского класса Nokogiri::XML::Node.Чтобы получить атрибут из узла, используйте []:

page.css('div.parent > *').each do |child|
  if(!%w{this that}.include?(child['class']))
    array.push(child.text.to_s)
  end
end

Вы также можете использовать if(child['class'] != 'this' && child['class'] != 'that'), если это имеет для вас больший смысл.

Однако атрибуты classможет иметь несколько значений, поэтому вы можете захотеть разбить их на части в пустом пространстве:

exclude = %w{this that}
page.css('div.parent > *').each do |child|
  classes = (child['class'] || '').split(/\s+/)
  if((classes & exclude).length > 0)
    array.push(child.text.to_s)
  end
end

Пересечение - это простой способ проверить, есть ли у двух массивов какие-либо общие элементы (т. е. classes содержит все, что вы хотите исключить).

...