Seite 1 von 1
Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 19:42
von Rednaxelarekced
Hallo,
schonmal vielen Dank für die Hilfe!
ich habe folgendes Problem. Ich möchte aus einer Adresse die Straße auslesen. Die Adresse besteht aber aus "Strasse, Ort, PLZ"
Jetzt habe ich die Strip() Methode genutzt und wenn ich auf einzelne Teile zugreifen will geht das ohne weiteres.
Code: Alles auswählen
adresse = results_update[1].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
Zugriff Strasse
Zugriff region
Da ich aber nicht nur einen Eintrag habe möchte ich über eine Liste drüber gehen
da bekomm ich aber immer wieder Fehler, kann mir da vielleicht jemand helfen.
Code: Alles auswählen
region_liste = []
for result in results_update:
# region
adresse = results_update[0].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
region_liste.append(result.adresse[1])
vielen Dank nochmal für die Hilfe
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 19:55
von rogerb
@Rednaxelarekced,
Ohne die genaue Fehlermeldung und den kompletten Code zu sehen, kann man da nur raten.
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 20:26
von Rednaxelarekced
Code: Alles auswählen
from bs4 import BeautifulSoup
import requests
import pandas as pd
webseite = 'https://www.trulia.com/CA/San_Francisco/'
response = requests.get(webseite)
response.status_code
soup = BeautifulSoup(response.content, 'html.parser')
results = soup.find_all('li',{'class':'SearchResultsList__WideCell-b7y9ki-2'})
results_update = []
for r in results:
if r.has_attr('data-testid'):
results_update.append(r)
adresse = results_update[1].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
adresse[0]
region = adresse[1],adresse[2]
print(region)
results_update[0].find('div',{'data-testid':'property-beds'}).get_text()
results_update[0].find('div',{'data-testid':'property-baths'}).get_text()
results_update[0].find('div',{'data-testid':'property-floorSpace'}).get_text()
region_liste = []
# For schleife
for result in results_update:
# region
adresse = results_update[0].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
region_liste.append(result.adresse[1])
hier ist der Fehler
Code: Alles auswählen
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-133-caaac4a44789> in <module>
10
11 adresse = results_update[0].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
---> 12 region_liste.append(result.adresse[1])
13
TypeError: 'NoneType' object is not subscriptable
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 20:50
von sparrow
result.adresse ist None
Code: Alles auswählen
>>> foo = None
>>> foo[0]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
foo[0]
TypeError: 'NoneType' object is not subscriptable
Ich habe mir deinen Code nicht näher angeschaut, aber ich finde das seltsam, dass du in der for-Schleife etwas an den Namen adresse bindest, das nicht mehr verwendest aber dafür result.adresse verwendest.
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 21:01
von rogerb
@Rednaxelarekced,
Hier ist der funktionierende Code.
Ich habe an einigen Stellen Kommentare eingefügt.
Ich hoffe es ist soweit verständlich, sonst frag nochmal nach.
Code: Alles auswählen
from bs4 import BeautifulSoup
import requests
import pandas as pd # wird gar nicht genutzt
webseite = 'https://www.trulia.com/CA/San_Francisco/'
response = requests.get(webseite)
response.status_code # Diese Zeile hat keine Auswirkung
soup = BeautifulSoup(response.content, 'html.parser')
results = soup.find_all('li',{'class':'SearchResultsList__WideCell-b7y9ki-2'})
results_update = []
for r in results:
if r.has_attr('data-testid'):
results_update.append(r)
# 2. Addresse
adresse = results_update[1].find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
adresse[0] # Diese Zeile hat keine Auswirkung
region = adresse[1],adresse[2]
print(region)
# Diese Zeilen haben keine Auswirkung
results_update[0].find('div',{'data-testid':'property-beds'}).get_text()
results_update[0].find('div',{'data-testid':'property-baths'}).get_text()
results_update[0].find('div',{'data-testid':'property-floorSpace'}).get_text()
region_liste = [] # es ist eigentlich eine Liste für Straßen, daher ist der Name verwirrend
for result in results_update:
# region
# Beim interieren muss man im result nach der Adresse suchen
adresse = result.find('div',{'data-testid':'property-address'}).find('a',{'data-testid':'property-card-link'}).get_text().split(',')
# Straße ist index 0 nicht 1, die Straße ist ist das erste Element von des Tuples addresse
region_liste.append(adresse[0])
print(region_liste)
Es scheint, das Ganze ist eine Baustelle, daher macht dein Code an einigen Stellen keinen Sinn.
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 21:08
von Rednaxelarekced
Hallo rogerb
Ich lerne gerade erst Python, deshalb vielen vielen Dank !
Lg rednaxelarekced
Re: Frage zu Beautiful Soup
Verfasst: Mittwoch 3. November 2021, 21:29
von rogerb
Man kann übrigens auch direkt auf die Adressen im HTML-Code zugreifen:
Code: Alles auswählen
from bs4 import BeautifulSoup
import requests
response = requests.get("https://www.trulia.com/CA/San_Francisco/")
soup = BeautifulSoup(response.content, "html.parser")
for address_element in soup.find_all("div", {"data-testid": "property-address"}):
print(address_element.text)
Re: Frage zu Beautiful Soup
Verfasst: Donnerstag 4. November 2021, 08:37
von Rednaxelarekced
Ich benötige nur "San Francisco, CA 94110" etc.
oder besser gesagt, zu Übungszwecken möchte ich einzelne Teile des Strings in eine Ergebnisliste speichern.
Re: Frage zu Beautiful Soup
Verfasst: Donnerstag 4. November 2021, 08:52
von rogerb
Das kann man erreichen indem man die Addresse zunächst in einzelne Teile zerlegt und die Leerzeichen jeweils an Anfang und Ende entfernt (mit strip()).
Das hattest du ja auch schon.
Ich verwende hier nur eine List-Comprehension weil es etwas kompakter ist.
Um Stadt, Staat und Zip-Code wieder in einen String zu vereinen nimmt man join()
Code: Alles auswählen
import pprint
from bs4 import BeautifulSoup
import requests
response = requests.get("https://www.trulia.com/CA/San_Francisco/")
soup = BeautifulSoup(response.content, "html.parser")
output_list = []
for address_element in soup.find_all("div", {"data-testid": "property-address"}):
parts = [part.strip() for part in address_element.text.split(",")]
output_list.append(", ".join(parts[1:]))
pprint.pprint(output_list)
Re: Frage zu Beautiful Soup
Verfasst: Donnerstag 4. November 2021, 09:02
von Rednaxelarekced
Super, genau das hat mir gefehlt.
Vielen lieben Dank !