2012-03-23 2 views
1

Я пытаюсь найти CSS элементы страницы, содержащий пробелы в конце имени класса:Как использовать селектор CSS с пространством в имени класса

@agent = Mechanize.new 
page = @agent.get(somepage) 

Если тег:

<div class="Example "> 

при попытке:

page.search('.Example') 

элемент не найден, и при попытке:

page.search('.Example ') <- space following the name 

Nokogiri вызывает исключение:

Nokogiri::CSS::SyntaxError: unexpected '$' after 'DESCENDANT_SELECTOR' 
+2

CSS классы не могут иметь пробелы, так как те, используются для селекторов потомков – alf

+0

«При попытке: („ Пример“) page.search элемент не найден »: это означает, что элемент не существует в HTML. –

+0

@alf Классы CSS не могут иметь пробелов, но они существуют в дикой природе. Не все документы HTML верны, но нам по-прежнему приходится работать с ними. –

ответ

0

Чтобы найти все элементы, имеющие класс атрибутов, оканчивающийся на пробельном:

page.search('*').select{|e| e[:class] =~ /\s$/} 
+3

имена классов не могут содержать пробелы, так как это разделитель, например. 'class =" red green blue "' - это три разных класса. –

+1

@Mark Thomas - Согласен, но атрибут класса элемента может закончиться пробелом, и я думаю, что это то, что он хочет идентифицировать. – pguardiario

+0

Правильно сгенерированный HTML не имеет пробелов в классах, если не указано несколько классов. HTML в дикой природе может иметь их, хотя это неправильно. Нам по-прежнему приходится работать с ними обоими. Таким образом, хотя технически они не могут существовать, они работают, потому что браузеры работают с ними, а людям, генерирующим страницы, все равно. –

2

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

require 'nokogiri' 
html = <<End 
    <html> 
    <span class="Example ">One</span> 
    <span class="Example foo">Two</span> 
    </html> 
End 

doc = Nokogiri::HTML(html) 

puts doc.search('.Example') 

Выход:

<span class="Example ">One</span> 
<span class="Example foo">Two</span> 

Так что я думаю, что ваш HTML-документ просто не имеет класс, содержащий Example в нем. Если бы вы предоставили образец HTML, на этот вопрос было бы легче ответить.

0

Если вы специально нацеливаете атрибут класса, вы можете включать пробелы. В моем случае значение класса имели место:

<p class="Event_CategoryTree category"> 

Вот как Таргетинг этот элемент с помощью Nokogiri:

page.at_css("[class='Event_CategoryTree category']") 
0

Вы можете использовать Xpath вместо этого. Следующий код возвращает все контейнеры DIV с классом a class with spaces:

doc = Nokogiri::HTML(page) 
result = doc.xpath('//div[@class="a class with spaces"]') 
Смежные вопросы