2012-03-23 59 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 2012-03-23 18:26:05

+0

“努力当:(‘例’)page.search的元素未找到“:这意味着该元素不存在于HTML中。 – 2012-03-23 19:05:48

+0

@alf CSS类不能有空白,但它们存在于野外。并不是每个HTML文档都是正确的,但我们仍然需要与他们合作。 – 2016-09-28 16:37:54

回答

0

发现具有类的所有元素空白属性结尾:

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

类名不能包含空格,因为这是分隔符,例如'class =“红绿蓝”是三个不同的类。 – 2012-03-24 22:07:27

+1

@Mark Thomas - 同意,但元素的类属性可以以空格结尾,我想这就是他想要识别的。 – pguardiario 2012-03-25 01:52:13

+0

正确生成的HTML在类中没有空格,除非定义了多个类。尽管它是错误的,但野外HTML可能会让他们看到。我们仍然必须与他们合作。所以,虽然技术上它们不可能存在,但它们的确如此,因为浏览器与它们一起工作,并且生成页面的人不关心。 – 2016-09-28 16:40:56

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"]')