BeautifulSoup webscrapping find_all (): Finden einer genauen Übereinstimmung

8

Ich benutze Python und BeautifulSoup für Web Scraping.

Sagen wir, ich habe den folgenden HTML-Code zum scrape:

%Vor%

Mit BeautifulSoup möchte ich NUR die Produkte mit dem Attribut class="product" finden (nur Produkt 1 und 2), nicht die "speziellen" Produkte

Wenn ich Folgendes tue:

%Vor%

Das Ergebnis enthält ALLE Produkte (1,2,3 und 4).

Was soll ich tun, um Produkte zu finden, deren Klasse GENAU mit "Produkt" übereinstimmt?

Der Code, den ich ausgeführt habe:

%Vor%

Ausgabe:

%Vor%     
user2436815 29.03.2014, 04:08
quelle

2 Antworten

25

In BeautifulSoup 4 wird das Attribut class (und mehrere andere Attribute wie accesskey und das Attribut headers für Tabellenzellenelemente) als Menge behandelt. Sie stimmen mit einzelnen Elementen überein, die im Attribut aufgeführt sind. Dies folgt dem HTML-Standard.

Daher können Sie die Suche nicht auf nur eine Klasse beschränken.

Sie müssen hier eine benutzerdefinierte Funktion verwenden, um mit der zu vergleichen Klasse stattdessen:

%Vor%

Ich habe eine lambda verwendet, um eine anonyme Funktion zu erstellen. Jedes Tag wird auf den Namen abgestimmt (muss 'div' sein), und das Klassenattribut muss genau der Liste ['product'] entsprechen; z.B. habe nur den einen Wert.

Demo:

%Vor%

Der Vollständigkeit halber sind hier alle solche Attribute aus dem BeautifulSoup-Quellcode aufgeführt:

%Vor%     
Martijn Pieters 29.03.2014 18:40
quelle
1

Sie können CSS-Selektoren wie folgt verwenden:

%Vor%

css-selectors

    
crunch 29.03.2014 04:25
quelle