Использование Nokogiri и XPath для получения узлов с несколькими атрибутами

Я пытаюсь использовать Nokogiri для анализа HTML-файла с довольно эксцентричной разметкой. В частности, я пытаюсь захватить divs, которые имеют оба идентификатора, несколько классов и стилей. Разметка выглядит примерно так:

<div id="foo">
  <div id="bar" class="baz bang" style="display: block;">
    <h2>title</h2>
    <dl>
      List of stuff
    </dl>
  </div>
</div>

Я пытаюсь схватить <dl> который сидит внутри проблемы div. Я могу получить divs с одним атрибутом id без проблем, но я не могу понять, как заставить Nokogiri захватить divs с обоими ID и классы. Так эти работают отлично:

content = @doc.xpath("//div[id='foo']")

content = @doc.css('div#foo')

но это ничего не возвращает:

content = @doc.xpath("//div[id='bar']")

content = @doc.xpath("div#bar")

есть ли что-то очевидное, что мне здесь не хватает?

4 ответов


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

вы хотите:

//div[id='bar' and class='baz bang' and style='display: block;']

Я думаю content = @doc.xpath("div#bar") является опечаткой и должно быть content = @doc.css("div#bar") или лучше content = @doc.css("#bar"). Первое выражение во втором фрагменте кода, кажется, в порядке.


для меня работает следующее.

require 'rubygems'
require 'nokogiri'

html = %{
<div id="foo">
  <div id="bar" class="baz bang" style="display: block;">
    <h2>title</h2>
    <dl>
      List of stuff
    </dl>
  </div>
</div>
}

doc = Nokogiri::HTML.parse(html)
content = doc
  .xpath("//div[@id='foo']/div[@id='bar' and @class='baz bang']/dl")
  .inner_html

puts content

Вы писали:

Я пытаюсь захватить divs, которые имеют оба идентификатора, несколько классов и стилей определено

и

Я пытаюсь схватить <dl> который сидит внутри проблемы div

Итак, это XPath 1.0:

//div[@id][contains(normalize-space(@class),' ')][@style]/dl