Zum Inhalt

So wählen Sie Elemente nach Klasse in XPath aus: Der ultimative Leitfaden

  • by
  • Blog
  • 8 min gelesen

Wenn Sie Daten von Websites extrahieren möchten, müssen Sie wahrscheinlich bestimmte Elemente basierend auf ihren Klassen auswählen. Klassen sind eine grundlegende Möglichkeit, Elemente in HTML zu kategorisieren und zu formatieren. Glücklicherweise bietet XPath leistungsstarke Möglichkeiten, Elemente anhand ihres Klassenattributs auszuwählen.

In dieser ausführlichen Anleitung erklären wir Ihnen genau, wie Sie mithilfe von XPath Elemente nach Klasse auswählen. Egal, ob Sie Anfänger oder erfahrener Web-Scraper sind, am Ende dieses Artikels werden Sie gekonnt durch HTML-Dokumente navigieren und genau auf die Elemente zielen, die Sie benötigen. Lass uns anfangen!

Eine kurze Zusammenfassung zu XPath

Bevor wir uns mit Klassenselektoren befassen, werfen wir einen kurzen Blick darauf, was XPath ist und wie es funktioniert. XPath ist eine Abfragesprache, die zum Navigieren und Auswählen von Knoten in einem XML- oder HTML-Dokument verwendet wird. Sie können damit Ausdrücke schreiben, die bestimmte Elemente anhand ihres Tag-Namens, ihrer Attribute, ihrer Position usw. lokalisieren.

Hier sind ein paar wichtige Dinge, die Sie über XPath wissen sollten:

  • XPath behandelt das Dokument wie eine Baumstruktur, von der ein Wurzelknoten und untergeordnete Knoten abzweigen
  • Ausdrücke werden von links nach rechts ausgewertet
  • Schrägstriche (/) werden zum Navigieren zwischen Knoten verwendet
  • Elemente können anhand ihres Namens ausgewählt werden (z. B //div wählt alle aus <div> Elemente)
  • Prädikate in eckigen Klammern ermöglichen eine genauere Auswahl (z. B //div[@id=‘main‘] wählt aus <div> Elemente mit der ID „main“)

Wenn diese Grundlage geschaffen ist, richten wir unsere Aufmerksamkeit auf Klassen und wie man sie in XPath-Ausdrücken nutzt.

HTML-Klassen verstehen

Klassen sind ein HTML-Attribut, mit dem Sie Elementen einen oder mehrere Klassennamen zuweisen können. Sie werden in erster Linie für Styling-Zwecke mit CSS verwendet, sind aber auch sehr nützlich, um beim Web-Scraping auf bestimmte Elemente abzuzielen.

Hier ist ein Beispiel für ein Absatzelement mit zwei Klassen:

<p class="highlight text-center">This is some text.</p>

In diesem Fall <p> Auf das Element werden zwei Klassen angewendet: „highlight“ und „text-center“. Ein Element kann eine beliebige Anzahl von Klassen haben, die im Klassenattributwert durch Leerzeichen getrennt sind.

Beachten Sie, dass bei Klassennamen die Groß-/Kleinschreibung beachtet werden muss. Also class="highlight" und class="Highlight" würden als zwei verschiedene Klassen betrachtet werden.

Nachdem wir nun verstanden haben, was HTML-Klassen sind, schauen wir uns an, wie wir mithilfe von XPath Elemente basierend auf ihren Klassen auswählen können.

Auswählen von Elementen nach Klasse in XPath

XPath bietet im Wesentlichen zwei Möglichkeiten, Elemente anhand ihres Klassenattributs auszuwählen:

  1. Verwendung der Funktion enthält()
  2. Exakte Klassennamenübereinstimmung

Lassen Sie uns jeden dieser Ansätze genauer untersuchen.

Ansatz 1: Verwendung der Funktion enthält()

Das contains() Mit der Funktion können Sie Elemente auswählen, deren Klassenattribut enthält ein bestimmter Klassenname. Hier ist die grundlegende Syntax:

//element[contains(@class,‘classname‘)]

Zum Beispiel, um alle auszuwählen <div> Elemente, die eine Klasse von „Container“ haben, würden Sie verwenden:

//div[contains(@class,‘container‘)]  

Das contains() Die Funktion weist einige Schlüsselmerkmale auf:

  • Dabei wird die Groß-/Kleinschreibung beachtet (daher würden „Container“ und „Container“ als unterschiedlich behandelt).
  • Der Klassenname kann an einer beliebigen Stelle im Klassenattributwert erscheinen
  • Auf das Element können auch andere Klassen angewendet werden, sofern es die angegebene Klasse enthält

So contains(@class,‘container‘) würde mit Elementen übereinstimmen wie:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

Aber es würde nicht Spiel:

<div class="containery"></div>
<div class="wrapper"></div>

Das contains() Der Ansatz ist vielseitig und kann eine gute Wahl sein, wenn Sie Elemente zuordnen möchten, die eine bestimmte Klasse als Teil eines haben kompensieren von Klassen. Wenn Sie jedoch genauer sein müssen, ist möglicherweise der nächste Ansatz vorzuziehen.

Ansatz 2: Exakte Zuordnung von Klassennamen

Um Elemente auszuwählen, die über ein Klassenattribut verfügen genau mit einem bestimmten Wert übereinstimmt, können Sie diese Syntax verwenden:

//element[@class=‘classname‘]

Zum Beispiel, um auszuwählen <p> Elemente, bei denen die Klasse genau „highlight“ ist, würden Sie verwenden:

//p[@class=‘highlight‘]

Dieser Ausdruck würde zu Folgendem passen:

<p class="highlight"></p>  

Aber nicht:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

Wie Sie sehen, ist der Ansatz der exakten Übereinstimmung strenger. Das Klassenattribut muss enthalten einzige den angegebenen Klassennamen, um eine Übereinstimmung zu erzielen. Es dürfen keine anderen Klassen vorhanden sein und die Groß-/Kleinschreibung muss genau übereinstimmen.

Dieser Ansatz ist nützlich, wenn Sie bei der Elementauswahl sehr präzise sein müssen und vermeiden möchten, dass versehentlich Elemente übereinstimmen, die die Klasse zufällig als Teil einer größeren Menge enthalten.

XPath und Klassen – Wichtige Überlegungen

Bei der Verwendung von XPath zur Auswahl von Elementen nach Klasse sind einige wichtige Dinge zu beachten:

  • Bei Klassennamen muss die Groß-/Kleinschreibung beachtet werden. Wie bereits erwähnt, werden „highlight“ und „Highlight“ als unterschiedliche Klassennamen behandelt. Stellen Sie sicher, dass Ihre XPath-Ausdrücke genau mit der Groß-/Kleinschreibung übereinstimmen.

  • Elemente können mehrere Klassen haben. Es kommt sehr häufig vor, dass auf Elemente mehr als eine Klasse angewendet wird, getrennt durch Leerzeichen. Der contains() Der Ansatz stimmt mit Elementen überein, solange sie die angegebene Klasse enthalten irgendwo in ihrem Klassenattribut.

  • Exaktes Matching ist präziser, aber weniger flexibel. Wenn Du [@class=‘classname‘], das Klassenattribut muss einzige diese Klasse enthalten. Wenn andere Klassen angewendet werden, wird das Element nicht abgeglichen. Im Gegensatz, contains(@class,‘classname‘) wird übereinstimmen, solange die Klasse irgendwo im Attributwert erscheint.

  • XPath wird von den meisten Web-Scraping-Tools und -Bibliotheken unterstützt. Unabhängig davon, ob Sie Python mit BeautifulSoup oder Scrapy, JavaScript mit Puppeteer oder Cheerio oder eine andere Sprache/ein anderes Framework verwenden, können Sie wahrscheinlich XPath-Ausdrücke zum Extrahieren von Daten verwenden. Die Syntax für die Klassenauswahl bleibt gleich.

  • Beim großflächigen Schaben kommt es auf die Leistung an. Obwohl XPath sehr leistungsfähig ist, kann es insbesondere bei komplexeren Ausdrücken auch langsamer sein als andere Methoden wie CSS-Selektoren. Wenn Sie eine große Anzahl von Seiten durchsuchen, lohnt es sich, verschiedene Ansätze zu vergleichen, um herauszufinden, welcher die beste Leistung bringt.

Best Practices und Tipps für die Klassenauswahl

Um die XPath-Klassenselektoren optimal zu nutzen, sollten Sie die folgenden Best Practices und Tipps berücksichtigen:

  • Verwenden Sie den einfachsten Ausdruck, der die Aufgabe erledigt. Manchmal eine einfache //element[@class=‘classname‘] ist alles, was du brauchst. Vermeiden Sie unnötige Komplexität.

  • Kombinieren Sie Klassenselektoren bei Bedarf mit anderen Kriterien. Sie können Prädikate verwenden, um Elemente basierend auf mehreren Attributen auszuwählen (z. B //button[@class=‘primary‘ and @type=‘submit‘]) oder Klassenselektoren mit Positionsselektoren kombinieren (z. B (//div[@class=‘row‘])[2] um die zweite Zeile auszuwählen).

  • Beachten Sie Änderungen am HTML-Code der Website. Klassen werden häufig zu Stilzwecken verwendet, was bedeutet, dass sie sich häufiger ändern können als andere Attribute wie IDs. Wenn Ihr Scraper kaputt geht, überprüfen Sie noch einmal, ob die Klassen, auf die Sie abzielen, noch auf der Seite vorhanden sind.

  • Verwenden Sie relative XPaths, um die Wiederholung langer Ausdrücke zu vermeiden. Wenn Sie bereits ein übergeordnetes Element ausgewählt haben, können Sie einen Punkt (.), um untergeordnete Elemente relativ zu diesem Element auszuwählen, z //div[@class=‘container‘]/./p.

  • Ziehen Sie für bestimmte Anwendungsfälle andere Methoden wie CSS-Selektoren oder Regex in Betracht. Obwohl XPath vielseitig ist, kann es vorkommen, dass ein anderer Ansatz einfacher oder schneller ist. CSS-Selektoren sind leistungsstark und gut für grundlegende Auswahlaufgaben geeignet. Reguläre Ausdrücke können zum Mustervergleich oder zum Extrahieren von Daten aus Textinhalten nützlich sein.

Beispiele für die Klassenauswahl

Lassen Sie uns einige Beispiele für die Klassenauswahl in Aktion mit Python und dem durchgehen lxml Bibliothek.

Angenommen, wir haben diesen HTML-Code:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

Alle auswählen <p> Elemente mit der Klasse „Highlight“ können wir verwenden contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

Wenn wir nur das auswählen wollten <p> Elemente, in denen sich die Klasse befindet genau „Hervorheben“ würden wir verwenden:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

Zur Auswahl der <div> Element und dann finden <p> Elemente mit der Klasse „highlight“ darin enthalten, können wir einen relativen XPath verwenden:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

Putting It All Together

In diesem Leitfaden haben wir uns eingehend mit der Auswahl von Elementen nach Klasse mithilfe von XPath befasst. Wir haben die beiden Hauptansätze – die Verwendung der Funktion „contains()“ und den exakten Klassennamenabgleich – sowie wichtige Überlegungen, Best Practices und Beispiele behandelt.

Um es zusammenzufassen:

  • XPath ist eine leistungsstarke Abfragesprache zum Auswählen von Elementen in HTML/XML-Dokumenten
  • Klassen sind eine Möglichkeit, Elementen Kategorien zuzuweisen, häufig zu Gestaltungs- oder Auswahlzwecken
  • Das contains(@class,‘classname‘) Der Ansatz wählt Elemente aus, die die angegebene Klasse als Teil ihres Klassenattributwerts enthalten
  • Das [@class=‘classname‘] Der Ansatz wählt Elemente aus, bei denen das Klassenattribut genau mit der angegebenen Klasse übereinstimmt
  • XPath-Klassenselektoren unterscheiden zwischen Groß- und Kleinschreibung und können mit anderen Kriterien oder relativen Selektoren kombiniert werden
  • Es ist wichtig, den einfachsten Ausdruck zu wählen, der Ihr Ziel erreicht, und auf Änderungen am HTML-Code der Website im Laufe der Zeit zu achten

Mit diesem Wissen sind Sie gut gerüstet, um eine Vielzahl von Web-Scraping-Herausforderungen mithilfe von XPath und Klassenselektoren zu bewältigen. Unabhängig davon, ob Sie Anfänger oder erfahrener Profi sind, ist es eine wesentliche Fähigkeit, zu verstehen, wie Sie die benötigten Elemente präzise anvisieren.

Denken Sie bei der Umsetzung dieser Techniken daran, stets respektvoll gegenüber den Websitebesitzern zu sein und alle geltenden Nutzungsbedingungen oder robots.txt-Dateien einzuhalten. Viel Spaß beim Schaben!

Mitreden

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