2016-07-19 17 views
0

Im folgenden HTML-Beispiel versuche ich den $ 16,95-Text im äußeren span.price Element zu extrahieren und den Text vom inneren span.sale auszuschließen.Wie man den Text eines Elements in Capybara findet, während ich den inneren Elementtext ignoriere

<div class="price"> 
    <span class="sale"> 
    <span class="sale-text">"Low price!"</span> 
    "$16.95" 
    </span> 
</div> 

Wenn ich Nokogiri verwenden würde, wäre dies nicht zu schwierig.

price = doc.css('sale') 
price.search('.sale-text').remove 
price.text 

Allerdings navigiert Capybara eher als Knoten entfernt. Ich wusste, dass etwas wie price.text Text von allen Unterelementen greifen würde, also versuchte ich, xpath zu verwenden, um spezifischer zu sein. p.find(:xpath, "//span[@class='sale']", :match => :first).text. Dies greift jedoch auch auf das innere Element zu.

Schließlich habe ich versucht, durch alle Spannen zu durchlaufen, um zu sehen, ob ich die Ergebnisse trennen könnte, aber ich bekomme einen mehrdeutigen Fehler.

Ich verwende Capybara/Selen, da dies für ein Web-Scrapping-Projekt mit Authentifizierung Komplikationen ist.

Antwort

1

Es gibt keinen einzigen Anweisung Weg, dies mit Capybara zu tun, da das DOMs-Konzept von innerText nicht wirklich unterstützt, was Sie tun möchten. Unter der Annahme, p wird das ‚.Preis‘ Element, zwei Möglichkeiten, wie Sie könnte bekommen, was Sie wollen sich wie folgt:

  1. Da Sie den Knoten wissen Sie ignorieren wollen subtrahieren nur, dass Text aus dem gesamten Text

    p.find('span.sale').text.sub(p.find('span.sale-text').text, '') 
    
  2. greifen die innerHTML- String und analysieren, die mit Nokogiri oder Capybara.string (die nur wickelt Nokogiri Elemente im Capybara DSL)

    doc = Capybara.string(p['innerHTML']) 
    nokogiri_fragment = doc.native 
    #do whatever you want with the nokogiri fragment 
    
+0

Schätzen Sie die Antwort, aber am Ende kratzte ich nur die HTML mit Capybara und Verarbeitung mit Nokogiri. Ich musste durch viele Ergebnisseiten navigieren, und die Kombination von Parsing mit langsamen Capybara-Knoten und seltsamen JS-Effekten ließ das Skript normalerweise einen StaleElementReferenceError auslösen. – dylankb

Verwandte Themen