Zum Inhalt

So finden Sie Elemente mit XPath in Selenium (umfassende Anleitung)

Als Experte für Web Scraping und Proxys mit über fünf Jahren Erfahrung habe ich festgestellt, dass XPath eine der nützlichsten und vielseitigsten Techniken zum Auffinden von Webelementen ist. Wenn Sie XPath-Selektoren beherrschen, können Sie Daten selbst aus den komplexesten Webseiten präzise extrahieren.

In diesem umfassenden Leitfaden mit mehr als 3200 Wörtern teile ich alles, was ich über das Suchen und Interagieren mit Elementen mithilfe von XPath in Selenium gelernt habe.

Was genau ist XPath?

Bevor wir uns mit der Verwendung befassen, ist es wichtig zu verstehen, was XPath eigentlich ist.

XPath steht für XML Path Language. Es handelt sich um eine Abfragesprache zum Auswählen von Knoten aus einem XML-Dokument. Im Wesentlichen stellt XPath eine Syntax zum Beschreiben von Teilen einer XML-Struktur bereit.

Da HTML wie XML strukturiert ist und Elemente wie öffnende und schließende Tags verschachtelt sind, kann XPath auch zum Zielen auf Teile eines HTML-Dokuments verwendet werden.

Laut w3schools einige wichtige Fakten zu XPath:

  • XPath verwendet Pfadausdrücke, um Knoten oder Knotensätze in einem XML-Dokument auszuwählen
  • Diese Pfadausdrücke ähneln stark den Pfadausdrücken, die Sie bei der Arbeit mit einem herkömmlichen Computerdateisystem sehen
  • XPath enthält über 100 integrierte Funktionen zum Bearbeiten von Zeichenfolgen, Zahlen, booleschen Werten, Knotensätzen usw.
  • XPath ist ein wichtiges Element in XSLT (Extensible Stylesheet Language Transformations)

Zusammenfassend ist XPath eine leistungsstarke Abfrage- und Extraktionssprache, die für die Navigation in XML-Dokumenten entwickelt wurde.

In welcher Beziehung steht XPath zu Selen?

Selenium ist ein Automatisierungsframework zur Steuerung von Webbrowsern. Wenn Sie eine Webseite in Selenium laden, wird der HTML-Inhalt in eine DOM-Struktur (Document Object Model) geparst.

Das DOM stellt die Seite visuell als Baum verschachtelter HTML-Elemente dar.

Mit XPath kann das DOM durchquert werden, um bestimmte Elemente auf der Seite zu finden und mit ihnen zu interagieren.

Betrachten Sie zum Beispiel diesen vereinfachten HTML-Code:

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

Das DOM könnte etwa so aussehen:

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

Anschließend können Sie XPath-Ausdrücke verwenden, um Elemente innerhalb dieser Struktur abzufragen:

/html/body/div[1]/p
//div/img

Dies macht XPath unglaublich nützlich für die Automatisierung von Aktionen an bestimmten Teilen einer Seite mit Selenium.

Grundlagen der XPath-Syntax

Nachdem Sie nun die Rolle von XPath verstanden haben, werfen wir einen Blick auf die Syntax.

XPath verwendet Pfadausdrücke, um Elemente und Attribute in einem XML-Dokument auszuwählen. Die Ausdrücke sehen Pfaden in einem Dateisystem wie auf Ihrem Computer sehr ähnlich:

/Users/jsmith/Documents/letter.docx

Der Schrägstrich / navigiert nach unten durch verschachtelte Ordner.

Einige grundlegende XPath-Muster:

  • nodename – Wählt alle Knoten mit dem Namen Knotenname aus
  • / – Wählt vom Wurzelknoten aus
  • // – Wählt Knoten in beliebiger Tiefe aus
  • . – Wählt den aktuellen Knoten aus
  • .. – Wählt den übergeordneten Knoten aus
  • @ – Wählt Attribute aus

Beispielsweise:

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

Es gibt viele weitere spezielle Syntaxen, die wir in diesem Handbuch behandeln werden. Mit diesen Grundmustern können Sie jedoch mit der Erstellung gezielter XPath-Selektoren beginnen.

Meiner Erfahrung nach können Sie Elemente auf den meisten Websites finden, wenn Sie nur 5–10 grundlegende XPath-Ausdrücke beherrschen.

Webelemente finden mit find_element und find_elements

Selenium bietet zwei Hauptmethoden zum Auffinden von Elementen mithilfe von XPath:

  • find_element() – Gibt ein einzelnes WebElement zurück, das dem XPath entspricht
  • find_elements() – Gibt eine Liste aller passenden WebElements zurück

Hier ist ein einfaches Anwendungsbeispiel:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

Mit diesen beiden Methoden können Sie die Leistungsfähigkeit von XPath nutzen, um automatisiert mit bestimmten Teilen einer Webseite zu interagieren.

Tipps zum Finden von Elementen

Basierend auf meiner langjährigen Erfahrung sind hier einige wichtige Tipps zum Erstellen von XPath-Selektoren:

  • Überprüfen Sie die HTML-Quelle – Durch die Anzeige des rohen HTML-Inhalts können Sie eindeutige Attribute und Muster für Zielelemente identifizieren. Alle modernen Browser verfügen über Entwicklertools zum Anzeigen der Quelle.

  • Kopieren Sie XPath im Browser – Die meisten Browser-Entwicklungstools bieten auch Funktionen zum Kopieren des vollständigen XPath eines Elements. Anschließend können Sie diese Basisselektoren optimieren und vereinfachen.

  • Konzentrieren Sie sich auf den Ausweis – Das id-Attribut eines Seitenelements bietet den direktesten und eindeutigsten Selektor //input[@id=‘search‘].

  • Klassen helfen – Klassenattribute ermöglichen flexiblere Abfragen wie //div[@class=‘results‘] wenn auch nicht völlig einzigartig.

  • Vermeiden Sie Indizes – Der Aufbau von Positionsindizes wie [1], [2] führt zu spröden Locators.

  • Kürzer ist besser – Prägnanter XPath mit minimalen verschachtelten Schritten hilft, langsame Abfragen oder falsche Übereinstimmungen zu vermeiden.

Wenn Sie diese Richtlinien beherrschen, können Sie robuste XPath-Selektoren erstellen, die auf elegante Weise auf erforderliche Seitenelemente abzielen.

Gängige XPath-Muster und -Rezepte

Da Sie nun die Grundlagen verstanden haben, schauen wir uns einige gängige Beispiele für XPath-Muster an:

Nach Attributwert auswählen

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

Teilweiser Attributabgleich

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

Wählen Sie Textübereinstimmung

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

Wählen Sie Kinder

/div/p
//tbody/tr/td

Indizierte Auswahl

(//input[@type=‘button‘])[2]

Verkettete Auswahl

//div[@id=‘nav‘]/ul/li/a 

Geschwistern folgen

//h1[text()=‘Articles‘]/following-sibling::p

Ich empfehle, sich mit jeder dieser gängigen Techniken vertraut zu machen. Sie bilden ein Toolkit mit XPath-Kenntnissen, das Ihnen bei der Erstellung robuster Abfragen gute Dienste leisten wird.

Beispiel für das Schaben

Lassen Sie uns ein Beispiel für ein Web-Scraping-Skript mit Selenium und XPath in Python durchgehen.

Wir extrahieren Produktdaten von einer E-Commerce-Website:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

Dies zeigt, wie XPath verwendet werden kann, um Elemente zum Scrapen verschachtelter Seitendaten präzise anzusprechen.

Häufige Probleme und Lösungen

Hier sind einige häufige Probleme, die bei der Verwendung von XPath-Locators in Selenium zusammen mit Abhilfestrategien auftreten können:

Timeouts

Wenn das Laden von Seiten einige Zeit in Anspruch nimmt, verwenden Sie implizite und explizite Wartezeiten:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Veraltete Elemente

Wenn sich das DOM ändert, lokalisieren Sie Elemente neu, um Ausnahmen wegen veralteter Elemente zu vermeiden:

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

Browser-Kompatibilität

Einige erweiterte XPath-Funktionen funktionieren möglicherweise nicht in allen Browsern. Testen Sie das Verhalten und vereinfachen Sie es bei Bedarf.

Langsame Leistung

Sehr komplexe XPath-Ausdrücke können die Testausführung verlangsamen. Vereinfachen Sie die Struktur, wo möglich.

Sichtbarkeit

Übereinstimmende Elemente sind möglicherweise nicht unbedingt sichtbar. Stellen Sie sicher, dass sie angezeigt werden, bevor Sie interagieren.

Erfahrung hilft, diese Probleme vorherzusehen – mit der Zeit werden sie viel einfacher zu bewältigen.

XPath-Alternativen

Obwohl XPath leistungsstark ist, ist es nicht immer die beste Lösung. Hier sind einige gängige Alternativen:

CSS-Selektoren

CSS-Selektoren bieten eine einfache und vertraute Möglichkeit, Elemente zu finden:

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

ID- und Namensattribute

Wenn IDs oder Namen wirklich eindeutig sind, verwenden Sie:

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

Link Text

Durch den Abgleich des vollständigen Linktextes können komplexe Abfragen vermieden werden:

driver.find_element(By.LINK_TEXT, ‘Logout‘)

Bewerten Sie jede Option für Ihre spezifischen Anforderungen. Ich finde oft, dass eine Kombination aus XPath, CSS, ID und Linktext-Locators maximale Robustheit bietet.

Vergleich von Locator-Strategien

Hier ist ein Vergleich von XPath mit einigen gängigen alternativen Strategien zur Elementlokalisierung:

VersandartBeispielVorteileNachteile
XPath//div/pSehr flexible AbfragenKomplexe Syntax
CSS-Auswahldiv.resultate pBekannte SyntaxZielt nur auf Klasse/ID/Attribute
ID#AnmeldeformularSehr schnell und einzigartigErfordert IDs
Name und VornameName=AbfrageEinzigartigVerlassen Sie sich auf Namenskonventionen
Link TextAbmeldenEinfach für LinksNur für Linktext

Wie Sie sehen, gibt es bei jeder Strategie Kompromisse. Die Verwendung von XPath zusammen mit CSS-Selektoren und -Attributen kann eine robuste Locator-Flexibilität bieten.

Erweiterte Verwendung mit lxml und parsel

Während Selenium über sehr praktische integrierte Suchmethoden verfügt, bieten spezielle Parsing-Bibliotheken wie lxml und parsel zusätzliche Leistung für komplexe Scraping-Aufgaben.

Diese Bibliotheken bieten neben vielen anderen Funktionen auch robuste XPath-Unterstützung wie:

  • Schnelle HTML- und XML-Parser
  • Unterstützung für XPath 1.0 und 2.0+
  • Eine große Auswahl an XPath-Funktionen und -Operatoren
  • Praktische Bindungen zum Parsen von HTML
  • Integration mit gängigen Frameworks wie Scrapy

Einige Anwendungsbeispiele:

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

Bei schwereren Scraping-Aufgaben greife ich oft zu diesen Bibliotheken, um die integrierten Funktionen von Selenium zu ergänzen.

Fazit und wichtige Erkenntnisse

Das Finden von Elementen mithilfe von XPath ist eine wesentliche Technik für jeden, der Selenium zur Testautomatisierung oder zum Web-Scraping verwendet.

Hier sind einige wichtige Lektionen, die ich aus der mehr als fünfjährigen Nutzung von XPath für die Interaktion mit komplexen Websites gelernt habe:

  • Beginnen Sie mit dem Erlernen einiger grundlegender XPath-Muster wie Attributabgleich, Textauswahl, untergeordnete Auswahl usw. Die meisten Anwendungen bauen auf diesen Grundlagen auf.

  • Es erfordert Übung, ein Gleichgewicht zwischen prägnanten, aber einzigartigen Abfragen zu finden. Es ist ebenso eine Kunst wie eine Wissenschaft.

  • Machen Sie sich mit Browser-Entwicklertools zum Überprüfen der Quelle und zum Kopieren anfänglicher XPath-Strings vertraut.

  • Ergänzen Sie XPath gegebenenfalls mit CSS-Selektoren und ID-/Namensattributen. Die Kombination von Ansätzen führt zu maximaler Robustheit.

  • Erwägen Sie erweiterte XPath-Parsing-Bibliotheken wie lxml und parsel für erweiterte Scraping-Funktionen über Selenium hinaus.

  • Lernen Sie durch Erfahrung, häufig auftretende Probleme wie veraltete Elemente und Zeitüberschreitungen im Laufe der Zeit zu antizipieren und zu bewältigen.

Ich hoffe, dass dieser Leitfaden eine umfassende Referenz zur Erschließung der Möglichkeiten der XPath-Elementauswahl mit Selenium bietet. Lassen Sie mich wissen, wenn Sie weitere spezifische Fragen haben!

Stichworte:

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *