Использование 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