2016-04-05 15 views
1

Ich verwende ein Python-Skript, um Informationen aus einer Website mithilfe der Selenium-Bibliothek zu extrahieren. einige Selektor, bekam ich ein WebElement Objekt des Elements Ziel ich nach dem ich so etwas wie folgt aussieht:Auswählen des übergeordneten Elementtextes nur mit Selenium

Die Id umgeben von:

<myTargetElement><strong>324. </strong>Some interesting content that might contain numbers 323 or dots ...,;</myTargetElement> 

ich zwei Informationen in separaten extrahieren möchten die strong Tag, und ich habe dies wie folgt geschehen:

myTargetElementObject.find_element_by_tag_name('strong').text.strip(' .') 

Jetzt bin ich verwirrt, wie der andere Teil zu extrahieren. Wenn ich myTargetElementObject.text benutze, wird es die ID innerhalb des Textes zurückgeben.

Die Daten, die ich extrahiere, sind sehr groß und ich bin vorsichtig bei der Verwendung von Regex. Gibt es eine Möglichkeit, mit WebElement-Objekt den Text des Elements ohne die Unterelemente zurückzugeben?

+0

Sofern nicht Daten auf die Festplatte gepuffert werden, gehe ich davon aus, dass Selenium bereits Ihre Daten analysiert hat und sich in einem Objekt im RAM befindet. –

Antwort

2

Ich würde den vollständigen Text des Zielelements erhalten und teilen Sie es durch die erste .:

strong, rest_of_the_content = myTargetElementObject.text.split(". ", 1) 

Im Allgemeinen aber ist die Aufgabe nicht so einfach (hier gibt es eine klare Trennzeichen haben) : Sie können nicht zielen und erhalten die Textknoten direkt in Selen - Dinge wie following-sibling::text(). Ein gemeinsamer Ansatz ist es, das Kind Text, Eltern Text zu erhalten und das Kind Text aus dem Eltern entfernen:


Ein anderer möglicher Ansatz einige separate HTML Parsing würde bedeuten, mit BeautifulSoup, wo Sie seitwärts gehen und Textknoten zugreifen können:

from bs4 import BeautifulSoup 

html = myTargetElementObject.get_attribute("outerHTML") 
soup = BeautifulSoup(html, "html.parser") 
label = soup.strong 
text_after = label.next_sibling 

print(label.get_text(), text_after) 
+0

Aber dann müssen Sie immer noch manuell die Yucky Parsing des umgebenden HTML tun, nein? Oder enthält '.text' nur' 324. Einige interessante Inhalte? – DaveBensonPhillips

+0

@HumphreyTriscuit nein, der '.text' würde Ihnen den vollständigen Text (mit Kindertexten rekursiv) geben. – alecxe

+0

@HumphreyTriscuit yeah, Sie würden die' 324 bekommen. Einige interessante Inhalte. – alecxe

Verwandte Themen