2014-10-01 50 views
1

我一直與Nokogiri工作了幾天,我絕對崇拜它。一切工作都非常出色,直到我得到了一個要求使用data-reactid javascript屬性標記的網站。問題是,Nokogiri似乎與這個網站使用的屬性id格式(幾個時段,一些美元符號和一些其他無效的xml/css字符)混淆:Nokogiri:如何選擇在其ID中包含句點的屬性的值?

我需要刮的一個例子是:

<td data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1">94.280</td> 

我所需要的屬性的內部值(94.280),用一個id」 .3.3.1:$ contract_23 $ = 1 $數據行:0.1"

通常在引入nokogiri我們將通過做類似的選擇:

doc.css("type[attributename=attributeid]") 

在我的例子那就是:

doc.css("td[data-reactid=.3.3.1:$contract_23.$=1$dataRow:0.1]") 

但無論我做什麼,以逃避無效字符,它不斷地說我有我的等號後無效字符登錄:

的錯誤信息以上代碼:

nokogiri-1.4.3.1/lib/nokogiri/css/parser.rb:78:in `on_error': unexpected '.3' after 'equal' 

我已經試過:

A)獲取我的字符串定義爲變量和強制進入一個字符串

b)用反斜槓逃逸它(0.3。[...])

c)用散列加前綴它(#.3.3 [...])

d)使用CGI escapedString

E)將其置於內部 '%{}' 例如它逃逸 '%{3.3 [...]}'

無論我做什麼,我都會收到相同的信息(除了選項e之外給我一個完全不同的錯誤信息:

: no .<digit> floating literal anymore; put 0 before dot 

你們可以幫助我得到正確的價值與這樣一個奇怪的命名屬性?

回答

1

你沒有告訴你如何解析您的文檔,但如果我解析它爲HTML,然後使用CSS選擇屬性值圍繞單引號,我可以得到標籤:

require 'nokogiri' 

html = <<END_OF_HTML 
<td data-reactid="hello">10</td> 
<td data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1">94.280</td> 
<td data-reactid="goodbye">20</td> 
END_OF_HTML 

html_doc = Nokogiri::HTML(html) 

html_doc.css("td[data-reactid='.3.3.1:$contract_23.$=1$dataRow:0.1']").each do |tag| 
    puts tag.text 
end 


--output:-- 
94.280 

通過這種SO後退房Mothereffing未加引號的屬性值驗證:

CSS attribute selectors: The rules on quotes (", ' or none?)

+0

哇,這是快!非常感謝!我使用HTML作爲解析器,並且您的方法確實有效!雙引號內的單引號的魔力!這是一種享受! – Antonio 2014-10-02 00:01:24

+0

@Antonio,不客氣。請注意,如果要將某些內容插入到字符串中,則使用雙引號。'planet =「地球」;放置「hello#{planet}」'因爲你不需要插入任何內容到你的css選擇器中,所以在外部使用單引號和在內部使用雙引號會更有意義:''td [data-reactid =「。3.3.1:$ contract_23。$ = 1 $ dataRow:0.1」]''裏面的雙引號與html中使用的雙引號具有一定的匹配對稱性。 – 7stud 2014-10-02 00:18:57

+0

@Antonio,至於'%q {}'和'%Q {''',它們不能在字符串中使用,但你可以這樣做:'%q {td [data-reactid =「。3.3 .1:$ contract_23。$ = 1 $ dataRow:0.1「]}'但是如果使用單引號更清晰,那麼沒有理由在這裏使用'%q {}'(或'%Q {}')。 – 7stud 2014-10-02 00:20:40

相關問題