2014-10-01 67 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

相关问题