BeautifulSoup webscraping find_all( ): Suche nach exakter übereinstimmung
Bin ich mit Python und BeautifulSoup für web-scraping.
Können sagen, ich habe den folgenden html-code zu kratzen:
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>
Mit BeautifulSoup, ich will zu finden, NUR die Produkte mit dem Attribut class="Produkt"
(nur Produkt 1 und 2), nicht die "speziellen" Produkte
Wenn ich den folgenden Code:
result = soup.find_all('div', {'class': 'product'})
das Ergebnis enthält ALLE Produkte (1,2,3 und 4).
Was soll ich tun, um Produkte zu finden, deren Klasse GENAU entspricht, 'Produkt'??
Ich den Code ran:
from bs4 import BeautifulSoup
import re
text = """
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>"""
soup = BeautifulSoup(text)
result = soup.findAll(attrs={'class': re.compile(r"^product$")})
print result
Ausgabe:
[<div class="product">Product 1</div>, <div class="product">Product 2</div>, <div class="product special">Product 3</div>, <div class="product special">Product 4</div>]
InformationsquelleAutor user2436815 | 2014-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
In BeautifulSoup 4, die
class
Attribut (und mehrere andere Attribute, wieaccesskey
und dieheaders
- Attribut in table-cell-Elemente) behandelt; Sie match gegen einzelne Elemente aufgeführt, die in dem Attribut. Dies folgt dem HTML-standard.Als solche, können Sie nicht beschränken Sie die Suche auf nur eine Klasse.
Müssen Sie eine benutzerdefinierte Funktion hier passend vor der Klasse statt:
Habe ich eine
lambda
erstellen einer anonymen Funktion; jeder tag ist abgestimmt auf name (muss sein'div'
), und das class-Attribut muss genau gleich der Liste['product']
; z.B. haben nur den einen Wert.Demo:
Vollständigkeit halber, hier sind alle solche Attribute festgelegt, von der BeautifulSoup-source-code:
soup.find_all('div', {'class': ['class1','class2']})
aber es war auch unterdiv
s, hatte nurclass2
. Mit dem ist es zu tun, was ich erwarten würde. Keine Ahnung, warum der eine war ich mit war nicht arbeiten, obwohl...InformationsquelleAutor Martijn Pieters
Können Sie mithilfe von CSS-Selektoren wie:
css-Selektoren
Oops, falsch gelesen deine Frage. Gut wäre eine alternative zu entfernen divs zusammenbringen ".Produkt.spezielle" dann können Sie sicher suchen ".Produkt" ohne Begegnung mit dem anderen.
InformationsquelleAutor crunch