In diesem Artikel erfahren Sie, wie Sie BS4 verwenden find()
Und find_all()
Methoden, die verschiedenen Möglichkeiten, mit ihnen Daten zu extrahieren, und die wichtigsten Unterschiede zwischen ihnen.
Wann ist der soup.find()
Methode Ihre beste Wahl? Sie ist perfekt, wenn Ihr Ziel darin besteht, das erste Vorkommen eines Elements zu ermitteln, das Ihren spezifischen Suchanforderungen auf einer Webseite entspricht.
Stellen Sie sich vor, Sie durchsuchen eine Koch-Website und möchten die Überschrift des beliebtesten Rezepts extrahieren. Geben Sie einfach den Typ des gesuchten Elements in der find()
Methode.
Wenn Sie beispielsweise die erste h1
Tag auf einer Seite mit mehreren h1
Stichworte.
from bs4 import BeautifulSoup html_doc = """ """ soup = BeautifulSoup(html_doc, 'html.parser') # Using .find() to fetch the first
Hier das find()
Methode erhält die erste h1
-Tag, das zeigt, wie Sie die benötigten spezifischen Daten direkt von einer Seite mit ähnlichen Elementen abrufen können.
Das Suchen von Elementen anhand ihrer CSS-Klasse ist eine der häufigsten Aufgaben beim Web Scraping, da Klassen häufig ähnliche Elemente auf einer Webseite gruppieren.
Schöne Suppen find()
Mit dieser Methode können Sie schnell das erste Element mit einer bestimmten Klasse finden. Dies ist besonders nützlich für Websites, die Inhalte mithilfe von Klassenattributen kategorisieren.
Nehmen wir beispielsweise unser vorheriges Beispiel zur Extraktion der Überschrift des Top-Rezepts weiter an und stellen Sie sich vor, Sie möchten die Beschreibung des Rezepts finden, die sich in einem div
Tag mit der Klasse recipe-description
.
# Using .find() to fetch the firsttag with class 'recipe-description' soup.find('div', class_='recipe-description')
Inhaltsverzeichnis
Find by ID
In HTML, the ID attribute uniquely identifies an element within a webpage, making it a precise target for web scraping using
soup.find()
. Since an ID is unique to a single element, specifying the element type is optional when searching by ID.If you’re looking to find a specific section with user reviews for the top recipe, identified by its unique ID,
user-reviews
, here’s how you’d proceed:# Using .find() to fetch the element with ID 'user-reviews' user_reviews_section = soup.find(id='user-reviews') print(user_reviews_section) # This would print out the element with the ID 'user-reviews' print(user_reviews_section.get_text()) # This prints the text content of the element with the ID 'user-reviews'Nach Attribut suchen
Zusätzlich zu den Standardattributen wie Klasse und ID bietet BeautifulSoup
find()
Mit dieser Methode können Sie nach Elementen basierend auf einem beliebigen Attribut suchen. Diese Flexibilität ist nützlich, wenn Sie Elemente ansprechen, die durch weniger gebräuchliche Attribute identifiziert werden, wie z. B. data-*-Attribute, aria-labels oder benutzerdefinierte Attribute, die für die Struktur einer Webseite spezifisch sind.Angenommen, jedes Rezept befindet sich in einem
div
Tag mit einem benutzerdefinierten Attributdata-recipe-type
Angabe der Art der Mahlzeit (z. B. „Suppe“, „Hauptgericht“, „Nachtisch“).Um das erste Rezept zu finden, das als „Hauptgericht“ markiert ist, verwenden Sie
data-recipe-type attribute
verwenden Sie diefind()
Methode wie folgt:# Using .find() to fetch the firsttag with a 'data-recipe-type' attribute of 'main course' soup.find('div', attrs={'data-recipe-type': 'main course'})
Find by Text
Searching by text content is another powerful feature of BeautifulSoup’s
find()
method, which, as its name implies, allows you to locate elements based on their text.This method is useful when you know the specific text content of an element you’re looking for but not necessarily its position or attributes on the webpage.
Considering our ongoing example with the cooking website, let’s say you want to find a section explicitly mentioning “award-winning” within its text, perhaps about a recipe or chef accolade.
To find an element containing the exact string “award-winning,” you can use the string parameter with the
find()
method.# Find the first string that exactly matches 'award-winning' soup.find(string="award-winning")Wenn Ihre Suchkriterien das Suchen nach Text beinhalten, der „preisgekrönt“ als Teil einer längeren Zeichenfolge enthält, oder wenn Sie nach Variationen der Phrase suchen, können Sie durch die Einbindung regulärer Ausdrücke (Regex) in den Zeichenfolgenparameter Ihre Suchflexibilität verbessern.
import re # Find the first string that contains 'award-winning', case-insensitive soup.find(string=re.compile("award-winning", re.IGNORECASE))Suche mit mehreren Kriterien
Schöne Suppen
find()
Die Methode ermöglicht die Suche nach einem einzelnen Kriterium, wie Tag-Name, Klasse, ID oder Text, unterstützt aber auch die Kombination mehrerer Kriterien für eine präzisere Elementauswahl. Auf diese Weise können Sie Ihre Suche auf bestimmte Elemente eingrenzen, die gleichzeitig mehrere Bedingungen erfüllen.Stellen Sie sich vor, Sie möchten einen
div
Element, das die Klasse enthältrecipe-card
und eindata-award
Attribut, das anzeigt, dass das Rezept eine Auszeichnung gewonnen hat. Diese Suche anhand mehrerer Kriterien stellt sicher, dass Sie auf der Webseite gezielt nach einem bestimmten Inhaltstyp suchen.So können Sie diese Suche durchführen mit
find()
mit mehreren Kriterien:# Using .find() to locate awith a specific class and a custom attribute soup.find('div', class_='recipe-card', attrs={'data-award': True})
Find Using Regex
Regular expressions (regex) are a powerful tool for pattern matching in strings, allowing you to search for complex patterns that might not be possible with simple substring searches.
In BeautifulSoup, you can use regular expressions with the
.find()
method to locate elements based on patterns within their text or attributes.Let’s consider a situation where you want to find the first element whose class name starts with the word “recipe.”
Here’s how you can find the element using
soup.find()
with regex:import re # Using .find() to find the first element with a class name that matches the regex pattern matched_element = soup.find(class_ = re.compile("^recipe"))So verwenden Sie BeautifulSoup.find_all()
Wann sollten Sie die
find_all()
Methode? Sie ist perfekt, wenn Sie alle Elemente auf einer Webseite sehen möchten, die Ihrer Suche entsprechen.Stellen Sie sich vor, wir haben gerade das beste Rezept auf einer Koch-Website gefunden, und zwar mit dem
find()
Methode. Jetzt sind wir neugierig, welche anderen Rezepte es gibt.Das ist wo
find_all()
kommt ins Spiel. Es ist, als würde man sagen: „Das erste Rezept war großartig, aber ich möchte auch alle anderen ausprobieren.“Durch Mitteilen
find_all()
was wir suchen, hilft es uns, jedes Rezept auf der Website zu sammeln. Auf diese Weise können wir jedes Gericht erkunden, das die Website bietet, und stellen sicher, dass wir keine anderen köstlichen Optionen verpassen.Alle HTML-Tags suchen
Nehmen wir an, Sie interessieren sich für alle
Tags auf einer Seite, nicht nur das erste. Sie möchten jede Hauptüberschrift sehen.
So würden Sie vorgehen:
from bs4 import BeautifulSoup html_doc = """ """ soup = BeautifulSoup(html_doc, 'html.parser') # Using .find_all() to grab allVerwenden von
find_all()
können wir alleTag auf der Seite. Mit
find_all()
denken Sie daran, dass immer eine Liste der Elemente zurückgegeben wird, die Ihren Kriterien entsprechen. Das bedeutet, dass Sie eine Liste zurückbekommen, auch wenn es nur einTag auf der Seite.
Alle Elemente nach Klasse suchen
Das Suchen von Elementen nach Klassen kommt beim Web Scraping häufig vor, da Klassen ähnliche Elemente auf einer Webseite gruppieren.
find_all()
hilft Ihnen, alle Elemente zu finden, die einer bestimmten Klasse gemeinsam sind.Nehmen wir an, wir wollen nicht mehr nur Überschriften, sondern alle Rezeptbeschreibungen auf unserer Koch-Website. Diese sind in
tags with the classrecipe-description
.So finden Sie sie schnell:
# Using .find_all() to collect alltags with class 'recipe-description' soup.find_all('div', class_='recipe-description')
Elements by ID with find_all()
The ID attribute in HTML is unique to each element on a webpage, making it a highly precise target for web scraping. With BeautifulSoup, even though an ID should be unique and
find()
is typically used for ID searches, you might usefind_all()
out of habit or for consistency in your code. Remember, even if you usefind_all()
to search by ID, you’ll likely get a list with just one item because of the ID’s uniqueness.If you’re after a specific section, like user reviews for the top recipe marked by the unique ID
user-reviews
, you’d usually usefind()
.However, here’s how you would do it with
find_all()
:# Using .find_all() to fetch the element with ID 'user-reviews' soup.find_all(id='user-reviews')Alle Elemente nach Attribut suchen
Über die übliche Klasse und ID hinaus, BeautifulSoup's
find_all()
ermöglicht die Suche nach Elementen anhand beliebiger Attribute, was sich hervorragend für die gezielte Suche nach bestimmten Details eignet, wiedata-*
Attribute oder benutzerdefinierte Webseitenattribute.Stellen Sie sich vor, jedes Rezept auf unserer Website ist verpackt in einem
tag, and each one has a custom attributedata-recipe-type
Angabe der Art der Mahlzeit (z. B. „Suppe“, „Hauptgericht“ oder „Nachtisch“).Um alle Rezepte zu sammeln, die als „Hauptgericht“ klassifiziert sind, verwenden Sie
data-recipe-type
Attribut, hier ist, wie Sie verwenden würdenfind_all()
:# Finding alltags marked as 'main course' soup.find_all('div', attrs={'data-recipe-type': 'main course'})
Find Multiple Elements by Text
Using
find_all()
to search by text content is a strong tool in BeautifulSoup, perfect for when you’re after elements that contain specific text. This is useful if you know what the element says but not where it is or what it looks like on the page.Imagine we’re still exploring the cooking website, and now we’re looking for any mention of “award-winning,” whether it’s about a recipe or a chef’s achievements.
To collect all elements with the exact phrase “award-winning,” you’d do this:
# Find all strings exactly matching 'award-winning' soup.find_all(string="award-winning")Und falls Sie im Text nach Variationen von „preisgekrönt“ suchen, vielleicht in verschiedenen Fällen oder innerhalb eines längeren Satzes, kann die Verwendung regulärer Ausdrücke (Regex) hilfreich sein:
import re # Find all strings containing 'award-winning', case-insensitive soup.find_all(string=re.compile("award-winning", re.IGNORECASE))find_all() mit mehreren Kriterien
find_all()
In BeautifulSoup können Sie nicht nur nach einem Kriterium suchen; Sie können mehrere kombinieren, wie Tag-Name, Klasse, ID oder Text. Dies ist ideal, wenn Sie sich auf Elemente konzentrieren möchten, die mehrere Bedingungen gleichzeitig erfüllen.Nehmen wir an, wir suchen jeden
element tagged with the classrecipe-card
mit einemdata-award
Attribut, das angibt, dass das Rezept preisgekrönt ist. Dieser Ansatz hilft uns, sehr spezifische Inhalte auf der Website zu finden.So gehen Sie vor mit
find_all()
für mehrere Kriterien:# Finding alltags with a specific class and custom attribute soup.find_all('div', class_='recipe-card', attrs={'data-award': True})
find_all() Using Regex
Regular expressions (regex) allow you to search for complex patterns in strings, making them a valuable tool for finding specific patterns in text or attributes that simple searches can’t handle. With BeautifulSoup, using regex can enhance your searches, allowing you to use
find_all()
to locate multiple elements that fit intricate patterns.Imagine we want to find all elements on a webpage whose class names begin with “recipe.” This situation is where regex shines, helping us identify elements by pattern rather than exact matches.
THere’s how you’d apply regex in
find_all()
:mport re # Using .find_all() to find elements where the class name matches our regex pattern soup.find_all(class_ = re.compile("^recipe"))