Heim BlogWeb-Scraping Verwenden der Methoden find() und find_all() von BeautifulSoup

Verwenden der Methoden find() und find_all() von BeautifulSoup

von Kadek

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 first 

tag with class 'recipe-description' soup.find('div', class_='recipe-description')

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 Attribut data-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 attributeverwenden Sie die find() Methode wie folgt:

	# Using .find() to fetch the first 

tag 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ält recipe-card und ein data-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 a 

with 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 all 

Verwenden von find_all()können wir alle Tag 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 ein Tag 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 class recipe-description.

So finden Sie sie schnell:

	# Using .find_all() to collect all 

tags 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 use find_all() out of habit or for consistency in your code. Remember, even if you use find_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 use find().

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, wie data-* Attribute oder benutzerdefinierte Webseitenattribute.

Stellen Sie sich vor, jedes Rezept auf unserer Website ist verpackt in einem

tag, and each one has a custom attribute data-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ürden find_all():

	# Finding all 

tags 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 class recipe-card mit einem data-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 all 

tags 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"))

find() vs find_all()

Wir haben bereits untersucht, wie die find_all() Methode ist von unschätzbarem Wert, um mehrere Elemente einer Webseite zu sammeln, die Ihren Suchkriterien entsprechen. Vergleichen wir sie nun mit find()um zu klären, wann und warum Sie sich für das eine oder das andere entscheiden könnten.

find_all() ist Ihr Tool für umfassende Suchvorgänge, mit dem Sie jedes Element abrufen können, das Ihren angegebenen Kriterien entspricht, wie z. B. Tag-Name, Klasse, ID oder andere Attribute. Diese Methode sollten Sie verwenden, wenn Sie eine Liste von Elementen für die weitere Analyse oder Verarbeitung zusammenstellen möchten.

Im Gegensatz dazu find() Die Methode ist auf höchste Genauigkeit spezialisiert. Sie gibt das erste Element zurück, das Ihren Suchkriterien entspricht, und stoppt den Suchvorgang, sobald diese Übereinstimmung gefunden wurde. Diese Methode ist besonders nützlich für Szenarien, in denen Sie an einem einzelnen, bestimmten Datenelement von der Seite interessiert sind und eine weitere Suche unnötig ist, sobald dieses Datenelement gefunden wurde.

Hier ist ein einfacher Vergleich:

  • find_all() Gibt eine Liste mit allen Elementen zurück, die den Suchkriterien entsprechen. Dies ist ideal, wenn Sie einen umfassenden Datensatz von der Seite benötigen.
  • find() gibt nur das erste übereinstimmende Element zurück und ist daher die bessere Wahl für schnelle Nachschlagevorgänge oder wenn nur das erste Vorkommen eines Elements für Ihre Anforderungen relevant ist.

Die Wahl zwischen find() Und find_all() hängt von der Art Ihrer Web Scraping-Aufgabe ab. Wenn Sie alle Instanzen eines bestimmten Elements extrahieren möchten, find_all() ist der richtige Weg.

Wenn Sie jedoch nur an der ersten Instanz interessiert sind oder schnell eine bestimmte Information finden müssen, find() bietet einen effizienteren Ansatz.

Beide Methoden sind für effizientes Web Scraping mit BeautifulSoup von grundlegender Bedeutung. Wenn Sie ihre unterschiedlichen Funktionen verstehen, können Sie effektiver navigieren und Daten aus HTML- und XML-Seiten extrahieren.

Lerne weiter

Das ist also eine Zusammenfassung zur Verwendung von BeautifulSoup's find() Und find_all() Methoden. Sie wissen jetzt, wie Ihnen dieses wichtige Tool dabei helfen kann, die benötigten Daten aus HTML- und XML-Seiten zu ermitteln und zu extrahieren.

Möchten Sie mehr über Web Scraping erfahren? Besuchen Sie unseren Blog, um anhand von fortgeschrittenen Tutorials einige echte Projekte in Angriff zu nehmen.

Hier sind ein paar, die einen Blick wert sind:

Bis zum nächsten Mal, viel Spaß beim Scrapen!

Related Posts

Hinterlasse einen Kommentar