2017-01-02 3 views
1

zu extrahieren Ich versuche, die Anzahl der Seiten (in diesem Fall 156) aus der Klasse div zu extrahieren. Der Code ist unten gezeigt.BeautifulSoup verwenden, um Seiteninformationen innerhalb div

<div class="listing-count-label listing-count-holder listing-count-holder-header">8007 listings, showing 1 to 156</div> 

Ich habe derzeit:

page = soup.find("div",{"class":"listing-count-label listing-count-holder listing-count-holder-header"}) 
for x in page: 
    print (x.text) 

ergibt:

[]

schließlich möchte ich page = 156.

+0

'x.text.split (‘ ‚) [- 1]' würde du Seite Nr. – user902384

Antwort

2

Das Problem ist, kehrt die find() ein einzelnes Element (a Tag Instanz), die auch iterable sein können - Sie über das Element Kinderlaufen würden. Und da es nur ein einziges Kind gibt - einen Textknoten, würde die Antwort von @Dekel funktionieren.

Aber Sie nicht wirklich brauchen, die for Schleife und einfach direkt den Text erhalten:

page = soup.find("div", {"class":"listing-count-label listing-count-holder listing-count-holder-header"}) 
print(page.get_text()) 

Auch brauchen Sie nicht wirklich alle Klassen eines Elements es zu lokalisieren aufzulisten,

soup.find("div", class_="listing-count-label") 

Oder mit einem CSS selector:

soup.select_one("div.listing-count-label") 
Sie können eine einzelne verwenden

Aber, da man bis zum Seitenanzahl sind, warum nicht finden wir das Element durch den Text ein regular expression mit - und wir die gleichen regulären Ausdruck verwenden werden, die Seitenanzahl Nummer zu extrahieren:

>>> import re 
>>> from bs4 import BeautifulSoup 
>>> 
>>> data = """<div class="listing-count-label listing-count-holder listing-count-holder-header">8007 listings, showing 1 to 156</div>""" 
>>> 
>>> pattern = re.compile(r"\d+ listings, showing \d+ to (\d+)") 
>>> 
>>> soup = BeautifulSoup(data, "html.parser") 
>>> 
>>> pattern.search(soup.find(text=pattern)).group(1) 
u'156' 

Und Sie können es in eine ganze Zahl umwandeln mit int(). Aber dieser Code fehlt Fehlerbehandlung - Dinge können schief gehen - stellen Sie sicher, dass Fehler entsprechend behandelt werden.

1

Die Variable x in Ihrem Beispiel ist NavigableString object, die nicht über das Attribut text verfügt. Das einzige, was Sie tun müssen, ist diese x zu verwenden oder zu string konvertieren (mit str(x)):

>>> page = soup.find("div",{"class":"listing-count-label listing-count-holder listing-count-holder-header"}) 
>>> for x in page: 
... print (x) 
8007 listings, showing 1 to 156 
1

Die find Methode ein Tag-Objekt finden. Anstatt die Syntax for zu verwenden, schreiben Sie einfach page.text.

1
number = soup.find('div', class_='listing-count-label').text.split()[-1] 

text: 8007 listings, showing 1 to 156 
split_text :['8007', 'listings,', 'showing', '1', 'to', '156'] 

Zuerst find() kehrt ein Tag, so dass Sie nicht über sie laufen kann, ist die Zahl im Text der Tag, so dass Sie .text verwenden können, um den Text zu erhalten und teilen Sie es durch den Raum, und erhalten die letztes Element der Aufteilungsliste.

Zweitens können Sie einen Teil des Klassenattributs verwenden, um Tags zu filtern, ohne dass ganze Attribute verwendet werden müssen.

Denken Sie daran, dass ein einzelnes Tag mehrere Werte für sein Attribut "class" haben kann. Wenn Sie nach einem Tag suchen, die eine bestimmte CSS-Klasse entspricht, Sie eine ihrer CSS-Klassen passend sind gegen:

css_soup = BeautifulSoup('<p class="body strikeout"></p>') 
css_soup.find_all("p", class_="strikeout") 
# [<p class="body strikeout"></p>] 

css_soup.find_all("p", class_="body") 
# [<p class="body strikeout"></p>] 
Verwandte Themen