2014-10-01 3 views
1

Я работаю с Нокогири в течение нескольких дней, и я абсолютно обожаю его. Все работало блестяще, пока у меня не возникло требование соскрести веб-сайт, на котором используется тег атрибута javascript с данными reactive. Проблема в том, что Nokogiri, похоже, путается с форматом идентификатора атрибута, используемым этим сайтом (несколько периодов, некоторые знаки доллара и некоторые другие недопустимые символы xml/css):Nokogiri: Как выбрать значение атрибута, содержащего периоды в его идентификаторе?

Примером того, что мне нужно, чтобы очистить, было бы :

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

мне нужно значение (94.280) внутри атрибута с идентификатором».3.3.1:. $ contract_23 $ = 1 $ DataRow: 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' 

Я пробовал:

а) Получение моя строка определяется как переменная и загнали в строку

б) Высвобождение его с обратной косой черты (.3. [...])

с) Приставка его с хэш (# .3.3 [...])

д) Экранирование его с помощью CGI escapedString

е) размещение его внутри '% {}', например '% {. 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 

Проверьте Mothereffing некотируемого значения атрибута валидатор с помощью этого SO сообщения:

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

+0

Ничего себе это было быстро! Большое спасибо! Я использую HTML в качестве своего парсера, и ваш метод действительно сработал! Магия одиночных кавычек внутри двойных! Это работает! – Antonio

+0

@ Антонио, добро пожаловать. Обратите внимание, что двойные кавычки используются, когда вы хотите что-то интерполировать в строку, например.'planet =" earth "; помещает «hello # {planet}» 'Поскольку вам не нужно интерполировать что-либо в ваш селектор css, было бы разумнее использовать одинарные кавычки снаружи и двойные кавычки внутри:' td [data-reactid = ". 3.3.1: $ contract_23. $ = 1 $ dataRow: 0,1"] '' И двойные кавычки внутри имеют определенную симметрию соответствия с двойными кавычками, используемыми в html. – 7stud

+0

@Antonio. Что касается '% q {}' и '% Q {}', они не могут использоваться внутри строки, но вы могли бы сделать это: '% q {td [data-reactid =". 3.3 .1: $ contract_23. $ = 1 $ dataRow: 0.1 "]}' Но нет причин использовать '% q {}' (или '% Q {}') там, когда более ясно использовать одинарные кавычки. – 7stud

Смежные вопросы