Используйте Nokogiri, чтобы получить все узлы в элементе, которые содержат определенное имя атрибута.

Я хотел бы использовать Nokogiri для извлечения всех узлов в элементе, который содержит определенное имя атрибута.

например, я хотел бы найти 2 узла, которые содержат атрибут "бла" в документе ниже.

@doc = Nokogiri::HTML::DocumentFragment.parse <<-EOHTML
<body>
  <h1 blah="afadf">Three's Company</h1>
  <div>A love triangle.</div>
   <b blah="adfadf">test test test</b>
</body>
EOHTML

Я нашел это предложение (ниже) на этом сайте: http://snippets.dzone.com/posts/show/7994, но не возвращает 2 узла в приведенном выше примере. Он возвращает пустой массив.

# get elements with attribute:
elements = @doc.xpath("//*[@*[blah]]")

Мысли, как это сделать?

Спасибо! я нашел это здесь


person user141146    schedule 03.09.2010    source источник


Ответы (2)


elements = @doc.xpath("//*[@*[blah]]")

Это не полезное выражение XPath. Он говорит дать вам все элементы, у которых есть атрибуты, у которых есть дочерние элементы с именем «бла». А поскольку у атрибутов не может быть дочерних элементов, этот XPath никогда ничего не вернет.

Фрагмент DZone сбивает с толку, когда они говорят

elements = @doc.xpath("//*[@*[attribute_name]]")

внутренние квадратные скобки не являются буквальными... они указывают, что вы указали имя атрибута. В то время как внешние квадратные скобки являются буквальными. :-п

У них также есть дополнительные * после @.

То, что вы хотите, это

elements = @doc.xpath("//*[@blah]")

Это даст вам все элементы, которые имеют атрибут с именем «blah».

person LarsH    schedule 03.09.2010

Вы можете использовать селекторы CSS:

elements = @doc.css "[blah]"
person Daniel O'Hara    schedule 03.09.2010