Gibt es eine get_xpath Methode oder eine Möglichkeit, etwas Ähnliches in Selen oder lxml.html zu erreichen? Ich habe das Gefühl, dass ich irgendwo etwas gesehen habe, aber so etwas in den Dokumenten nicht finden kann.

Pseudocode zur Veranschaulichung:

browser.find_element_by_name('search[1]').get_xpath()

>>> '//*[@id="langsAndSearch"]/div[1]/form/input[1]'
2
root 8 Okt. 2012 im 23:18

3 Antworten

Beste Antwort

Da es keine eindeutige Zuordnung zwischen einem Element und einem xpath-Ausdruck gibt, ist eine allgemeine Lösung nicht möglich. Aber wenn Sie etwas über Ihre XML / HTML wissen, kann es einfach sein, es selbst zu schreiben. Beginnen Sie einfach mit Ihrem Element, gehen Sie mit parent den Baum hinauf und generieren Sie Ihren Ausdruck.

3
Achim 8 Okt. 2012 im 19:32

Dieser Trick funktioniert in lxml:

In [1]: el
Out[1]: <Element span at 0x109187f50>

In [2]: el.getroottree().getpath(el)
Out[2]: '/html/body/div/table[2]/tbody/tr[1]/td[3]/table[2]/tbody/tr/td[1]/p[4]/span'

Siehe Dokumentation zu getpath.

4
kavinyao 17 Nov. 2013 im 01:23

Unabhängig von der verwendeten Suchfunktion können Sie Ihre Suche mit xpath neu formatieren, um Ihr Element zurückzugeben. Zum Beispiel,

driver.find_element_by_id('foo')
driver.find_element_by_xpath('//*@id="foo"')

Gibt genau die gleichen Elemente zurück.

Abgesehen davon würde ich argumentieren, dass es möglich wäre, Selen mit dieser Methode zu erweitern, aber fast sinnlos - Sie stellen dem Modul bereits alle Informationen zur Verfügung, die es benötigt, um das Element zu finden. Warum sollten Sie xpath verwenden (was mit ziemlicher Sicherheit der Fall sein wird?) schwerer zu lesen?) um das überhaupt zu tun?

In Ihrem Beispiel würde browser.find_element_by_name('search[1]').get_xpath() einfach '//*@name="search[1]"' zurückgeben. da die Annahme ist, dass Ihre ursprüngliche Elementsuche das zurückgegeben hat, wonach Sie gesucht haben.

1
kreativitea 8 Okt. 2012 im 20:22