2015-06-16 2 views
0

Я получил имя класса CSS из узла Nokogiri. Теперь я хочу найти все узлы, которые также имеют один и тот же класс.Seach by class in Nokogiri nodeset

Я не знаю, какой HTML-тег элемент, который я ищу, и насколько он глубокий. Все, что я знаю, это класс для поиска.

Я уже пробовал:

doc.xpath("//*[contains(@class, #{css})]") 

Но это, кажется, обратный путь слишком много элементов.

Также я попробовал:

doc.xpath("//*[@class, #{css}]") 

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

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

Можно ли это сделать с помощью Nokogiri?

+0

Я не использовал Nokogiri на некоторое время, но не doc.css ('мой -class ') или doc.search (' my-class ') делать то, что вы хотите? Nokogiri прекрасно работает с CSS-селекторами, и вам нужно только прибегнуть к XPath для расширенного соответствия. – Jimeux

ответ

1

Предполагая, что имя класса хранится в class_name, я думаю, что

doc.xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' #{class_name} ')]") 

является то, что вы ищете.

Это будет соответствовать все элементы, которые содержат class_name в свои классы, то есть, если class_name есть «окно», то это будет соответствовать оба элемента, как div class="box" и элементы, такие как div class="box left"

Если вы хотите, чтобы соответствовать элементам, как div class="box" т.е. есть только один класс и этот класс является тот, который вы ищете, то вы могли бы использовать это:

doc.xpath("//*[@class=\"#{class_name}\"]") 
+0

doc.xpath ("// * [@ class = \" # {class_name} \ "]") был именно тем, что мне нужно, спасибо! – user2926430

2

Как я уже сказал в своем комментарии, .css() или .search() могут найти все элементы данного класса.

Вот пример из скребка, который я написал некоторое время назад. Он находит только .content div на странице (at() будет выбирать только первый элемент), а затем находит все .col div внутри. Затем он проходит через них и печатает заголовок.

content = page.at('.content') 
content.css('.col').each do |col| 
    puts col.at('h5').text 
end 
Смежные вопросы