Zum Inhalt

So wählen Sie Elemente nach Text in XPath aus

  • by
  • Blog
  • 6 min gelesen

Beim Scraping von Websites müssen Sie häufig Elemente auf der Seite anhand ihres Textinhalts auswählen. Dadurch können Sie genau auf die Daten zugreifen, die Sie extrahieren möchten. XPath, eine Abfragesprache zum Auswählen von Knoten in XML- und HTML-Dokumenten, bietet einige Möglichkeiten, dies mithilfe von zu tun contains() und text() Funktionen.

In diesem Leitfaden werfen wir einen detaillierten Blick darauf, wie Sie diese Textauswahltechniken in Ihren XPath-Ausdrücken nutzen können. Wir behandeln die Syntax, gehen Beispiele durch und besprechen einige Best Practices, die Ihnen dabei helfen, Elemente beim Web Scraping effektiv anhand ihres Textinhalts auszuwählen.

Verwenden von enthält() zum Auswählen von Elementen, die Text enthalten

Der XPath contains() Mit der Funktion können Sie Elemente auswählen, die eine bestimmte Textteilzeichenfolge enthalten. Es braucht zwei Argumente:

  1. Ein Knotensatz, in dem gesucht werden soll
  2. Die abzugleichende Textteilzeichenfolge

Die Syntax sieht so aus:

//element[contains(text(), "substring")]

Dadurch werden alle ausgewählt element Knoten, deren Textinhalt das angegebene enthält substring.

Betrachten Sie beispielsweise den folgenden HTML-Code:

<ul>
  <li>Apples</li>
  <li>Oranges</li>
  <li>Pears and Grapes</li>
</ul>

Alle auswählen <li> Elemente, die den Text „und“ enthalten, würden Sie verwenden:

//li[contains(text(), "and")]

Dies würde zum dritten passen <li> Element „Birnen und Trauben“.

Das contains() Bei der Funktion wird standardmäßig die Groß-/Kleinschreibung beachtet. Um eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, können Sie die verwenden lower-case() or upper-case() Funktionen zur Normalisierung der Groß-/Kleinschreibung:

//li[contains(lower-case(text()), "and")]

Ein Hauptmerkmal von contains() besteht darin, dass sich die Teilzeichenfolgenübereinstimmung über untergeordnete Elemente erstrecken kann. Zum Beispiel in diesem HTML:

<p>
  Select <em>this</em> paragraph.
</p>

Der XPath //p[contains(text(), "Select this")] würde immer noch mit dem übereinstimmen <p> Tag, auch wenn „Select“ und „this“ durch das getrennt sind <em> untergeordnetes Element.

Verwenden von text() zum Auswählen von Elementen nach exaktem Text

Während contains() ist für teilweise Textübereinstimmungen nützlich. Manchmal müssen Sie jedoch den gesamten Textinhalt genau abgleichen. Hier ist die text() Funktion kommt ins Spiel. Sie wählt Elemente basierend auf ihrem Volltextinhalt aus.

Die Syntax lautet:

//element[text()="exact text"]

Zum Beispiel mit diesem HTML:

<div>
  <p>Hello world!</p>
  <p>Hello again</p>
</div>

Der XPath-Ausdruck //p[text()="Hello world!"] würde nur den ersten auswählen <p> Element. Der Zweite <p> Element stimmt nicht überein, da sein Textinhalt nicht genau „Hallo Welt!“ ist.

Im Gegensatz zu contains(), der text() Die Funktion stimmt nur mit dem direkten Textinhalt eines Elements überein. Der Text in untergeordneten Elementen wird nicht abgeglichen. Zum Beispiel, //div[text()="Hello world!"] würde mit nichts im obigen HTML übereinstimmen, weil die <div> selbst enthält nicht direkt den Text „Hallo Welt!“. Dieser Text befindet sich innerhalb der <p> untergeordnetes Element.

Like contains(), der text() Bei der Funktion wird standardmäßig die Groß-/Kleinschreibung beachtet. Das gleiche lower-case() or upper-case() Eine Problemumgehung kann für den Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung verwendet werden.

Kombinieren von Textselektoren mit anderen XPath-Ausdrücken

Textselektoren werden noch leistungsfähiger, wenn sie mit anderen Teilen von XPath-Ausdrücken kombiniert werden, z. B. Tag-Namen, Attributen und Positionsselektoren. Auf diese Weise können Sie sehr zielgerichtete Selektoren erstellen, um einen Drilldown zu genau den Elementen durchzuführen, die Sie benötigen.

Beispielsweise könnten Sie zur Auswahl den folgenden XPath verwenden <a> Elemente, die das Wort „click“ in ihrem Linktext enthalten, aber nur, wenn sie auch die Klasse „cta-button“ haben:

//a[contains(text(), "click") and @class="cta-button"]

Oder dieser Ausdruck, um den dritten auszuwählen <p> Element auf der Seite, aber nur, wenn sein Textinhalt mit „Einleitung“ beginnt:

//p[starts-with(text(), "Introduction")][3]

Durch das Mischen und Anpassen verschiedener XPath-Konstrukte können Sie sehr spezifische Selektoren erstellen, um nahezu jedes Web-Scraping-Szenario zu bewältigen.

Beispiele für Textauswahl mit Python-Bibliotheken

Schauen wir uns einige praktische Beispiele für die Verwendung von XPath-Textselektoren mit gängigen Python-Web-Scraping-Bibliotheken an.

Beispiel mit lxml und Anfragen

import requests
from lxml import html

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
tree = html.fromstring(page.content)

# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)

# Print the href attribute of each selected link
for link in links:
    print(link.get(‘href‘))

Beispiel mit BeautifulSoup

import requests
from bs4 import BeautifulSoup

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)

# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)

print(intro_para.text)

Beispiel mit Selen

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

# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)

# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)

submit_button.click()

Tipps und Best Practices

Beachten Sie bei der Verwendung von XPath-Textselektoren für Web Scraping die folgenden Tipps:

  1. Achten Sie auf Leerzeichen im Text, den Sie abgleichen möchten. Zusätzliche Leerzeichen oder Zeilenumbrüche können dazu führen, dass Ihre Selektoren fehlschlagen. Verwenden Sie normalize-space(), um führende und nachfolgende Leerzeichen zu entfernen und bei Bedarf innere Leerzeichen zu reduzieren.

  2. Achten Sie auf die Großschreibung. Standardmäßig wird beim Textabgleich in XPath die Groß-/Kleinschreibung beachtet. Verwenden Sie „lower-case()“ oder „upper-case()“ für den Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung.

  3. Vermeiden Sie zu allgemeine Textselektoren, da diese mit unbeabsichtigten Elementen übereinstimmen können. Versuchen Sie, Textselektoren mit Elementnamen oder Attributen zu kombinieren, um sie spezifischer zu gestalten.

  4. Testen Sie Ihre Selektoren immer anhand echter, aktueller Seiteninhalte. Websites ändern sich häufig, sodass Selektoren, die gestern funktionierten, heute möglicherweise fehlschlagen, wenn der Textinhalt aktualisiert wurde.

  5. Wenn eine Website inkonsistente Formatierungen oder benutzergenerierte Inhalte aufweist, sind Textselektoren möglicherweise unzuverlässig. In diesen Fällen ist es oft besser, strukturelle Selektoren zu verwenden, die auf Elementnamen, Attributen oder der Position im Dokumentbaum basieren.

Zusammenfassung

XPath bietet leistungsstarke Möglichkeiten zur Auswahl von Elementen basierend auf ihrem Textinhalt mithilfe von contains() und text() Funktionen. contains() ist nützlich, um Elemente abzugleichen, die eine bestimmte Textteilzeichenfolge enthalten text() wählt Elemente anhand ihres genauen Volltextinhalts aus.

Diese Textselektoren sind noch effektiver, wenn sie mit anderen XPath-Ausdrücken kombiniert werden, um gezielte Elementselektoren für das Web-Scraping zu erstellen.

Mehr als nur contains() und text(), XPath verfügt über mehrere weitere nützliche Funktionen für die Arbeit mit Text, wie z starts-with(), ends-with(), normalize-space(), und mehr. Investieren Sie etwas Zeit in das Erlernen dieser und anderer wichtiger Teile der XPath-Syntax.

Mit fundierten Kenntnissen der XPath-Textselektoren sind Sie auf dem besten Weg, die benötigten Daten gezielt aus Webseiten zu extrahieren. Viel Spaß beim Schaben!

Mitreden

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