2012-03-23 22 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"]')