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 entsprichtfind_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:
Versandart | Beispiel | Vorteile | Nachteile |
---|---|---|---|
XPath | //div/p | Sehr flexible Abfragen | Komplexe Syntax |
CSS-Auswahl | div.resultate p | Bekannte Syntax | Zielt nur auf Klasse/ID/Attribute |
ID | #Anmeldeformular | Sehr schnell und einzigartig | Erfordert IDs |
Name und Vorname | Name=Abfrage | Einzigartig | Verlassen Sie sich auf Namenskonventionen |
Link Text | Abmelden | Einfach für Links | Nur 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!