Используйте Nokogiri, чтобы получить все узлы в элементе, который содержит определенное имя атрибута - PullRequest
4 голосов
/ 04 сентября 2010

Я хотел бы использовать 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]]")

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

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

Ответы [ 2 ]

7 голосов
/ 04 сентября 2010
elements = @doc.xpath("//*[@*[blah]]")

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

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

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

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

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

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

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

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

3 голосов
/ 04 сентября 2010

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

elements = @doc.css "[blah]"
...