2016-06-18 5 views
1

Hier ist der HTML-Code, den ich den Text vonPython Selen, wie Extrakt Text nach Elemente

<fieldset> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">CNPJ:</label>011234560083 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">CIDADE:</label>TAUBATE 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">ESTADO:</label>SP 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">TOTAL BRUTO: </label>2.407,09 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">LIQ: </label>2.344,09 
    </div> 
</fieldset> 

dieser Code

print browse.find_element_by_xpath("//div[@class='grid-3-12 form-no-lbl']").text 

kehrt nur die erste Element zu extrahieren versuchen: 011234560083

Ich möchte Werte für jedes Etikett lesen wie "LIQ:" = 2,344,09

Antwort

0

Es ist ein eher häufiges Problem in Selen. Nur weil Sie können die Textknoten nicht direkt mit find_element_by_* Befehle übereinstimmen.

In Ihrem Fall nehme ich an, dass Sie die , ESTADO usw. Etiketten vorher kennen und einen Wert durch das Etikett erhalten müssen.

Die Idee wäre, ein label von Text zu lokalisieren, um den Baum zu dem übergeordneten nach oben, um den Text zu erhalten, geteilt durch : und das letzte Element zu erhalten, die auf den gewünschten Wert entsprechen würde:

label = "ESTADO" 
text = driver.find_element_by_xpath("//label[starts-with(., '%s:')]/.." % label).text 
print(text.split(":")[-1].strip()) 
1

Wenn Sie den Luxus haben, sowohl als auch lxml verfügbar zu haben, können Sie selenium zum Navigieren zu den gewünschten Seiten verwenden und dann lxml verwenden, um den HTML-Code zu analysieren. Zum Beispiel

import lxml.html as LH 
# content = browser.page_source 
content = '''\ 
<fieldset> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">CNPJ:</label>011234560083 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">CIDADE:</label>TAUBATE 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">ESTADO:</label>SP 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">TOTAL BRUTO: </label>2.407,09 
    </div> 
    <div class="grid-3-12 form-no-lbl"> 
      <label class="form-lbl">LIQ: </label>2.344,09 
    </div> 
</fieldset>''' 

root = LH.fromstring(content) 
labels = root.xpath('//fieldset/div[@class="grid-3-12 form-no-lbl"]/label') 
data = [[item.strip() for item in [elt.text, elt.tail]] for elt in labels] 

ergibt

[['CNPJ:', '011234560083'], 
['CIDADE:', 'TAUBATE'], 
['ESTADO:', 'SP'], 
['TOTAL BRUTO:', '2.407,09'], 
['LIQ:', '2.344,09']] 
+0

Perfect, aber sorry, wie kann ich die gesamte HTML von diesem erhalten: {>>> Elem = brf.find_element_by_xpath ("// div [@ class = 'raster 12.03 Form-no-LBL '] ") >>> print elem } – Lara

+2

@La sicher, verwenden Sie das' elem.get_attribute ("outerHTML") '. (Oder verwenden Sie "innerHTML", wenn Sie die aktuelle Elementdarstellung in der Ausgabe nicht benötigen). – alecxe

1

Es scheint wirklich seltsam, dass Ihr Code funktioniert nicht. Ich bin nicht so in einen Fall geraten. Ich denke, der folgende Code sollte funktionieren. Grundsätzlich greife ich den Text innerhalb der LABEL und vor dem Text, den Sie bereits finden. Die Kombination sollte Ihnen den gesuchten Text liefern.

lines = browse.find_elements_by_css_selector("div.grid-3-12.form-no-lbl") 
for line in lines 
    print line.find_element_by_css_selector("label.form-lbl").text + line.text