2012-03-23 16 views
1

Ich versuche, CSS-Elemente auf einer Seite zu finden, mit einem Leerraum am Ende des Klassennamen verwenden:Wie CSS-Selektor mit Platz in Klassennamen

@agent = Mechanize.new 
page = @agent.get(somepage) 

Wo der Tag:

<div class="Example "> 

beim Versuch:

page.search('.Example') 

das Element nicht gefunden wird und bei dem Versuch,:

page.search('.Example ') <- space following the name 

Nokogiri löst eine Ausnahme:

Nokogiri::CSS::SyntaxError: unexpected '$' after 'DESCENDANT_SELECTOR' 
+2

CSS-Klassen können nicht Leerzeichen haben, da diese für die untergeordneten Selektoren verwendet werden – alf

+0

„Beim Versuch: (‚ Beispiel‘) page.search die Element wird nicht gefunden ": Dies bedeutet, dass das Element nicht im HTML existiert. –

+0

@alf CSS-Klassen können keinen Whitespace haben, aber sie existieren in der Wildnis. Nicht jedes HTML-Dokument ist korrekt, aber wir müssen immer noch mit ihnen arbeiten. –

Antwort

0

alle Elemente finden Klasse mit in Leerzeichen Attribut endet:

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

Klassennamen dürfen keine Leerzeichen enthalten, da dies der Begrenzer ist, z. 'class =" rot grün blau "' ist drei verschiedene Klassen. –

+1

@Mark Thomas - Einverstanden, aber das Klassenattribut eines Elements kann in Leerzeichen enden und ich denke, das ist es, was er identifizieren möchte. – pguardiario

+0

Korrekt generierter HTML-Code enthält keine Leerzeichen in Klassen, sofern nicht mehrere Klassen definiert sind. HTML in der Wildnis könnte sie haben, obwohl es falsch ist. Wir müssen immer noch mit ihnen arbeiten. Also, obwohl sie technisch nicht existieren können, tun sie es, weil Browser mit ihnen funktionieren, und den Leuten, die die Seiten erzeugen, ist das egal. –

2

Ihre implizite Prämisse, dass eine Klasse nicht gefunden werden kann, weil es ein enthält Raum, ist falsch. Klassennamen enthalten keine Leerzeichen. Beweis:

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

Ausgang:

<span class="Example ">One</span> 
<span class="Example foo">Two</span> 

Also ich denke, das HTML-Dokument nicht einfach eine Klasse enthält Example darin. Wenn Sie das Beispiel-HTML zur Verfügung gestellt hätten, wäre diese Frage leichter zu beantworten.

0

Wenn Sie gezielt auf das Klassenattribut abzielen, können Sie Leerzeichen einfügen. In meinem Fall hatte der Klassenwert einen Raum:

<p class="Event_CategoryTree category"> 

Hier ist, wie ich dieses Element mit Nokogiri gezielt: Statt

page.at_css("[class='Event_CategoryTree category']") 
0

Sie können XPath verwenden. Der folgende Code wird alle div-Container mit der Klasse zurückgeben a class with spaces:

doc = Nokogiri::HTML(page) 
result = doc.xpath('//div[@class="a class with spaces"]')