ich taste mit DIY an das Thema WebScraping per Python ran. Als einfacher Einstieg lese ich von einer öffentlichen Seite Ist-Belegungen von Parkhäusern aus. Die Seite (Link unten) stellt die Belegungen von fünf Städten in gleicher Struktur zusammen. Das Auslasen klappt bei vier von fünf Städten auch gut - nur eine macht Probleme. Und das, obwohl ich im html eigentlich keinen wirklichen Unterschied erkennen kann.
Klappt: https://www.harmonyfm.de/service/parkha ... baden.html
Klappt nicht: https://www.harmonyfm.de/service/parkha ... nheim.html
Code, der erfolgreich ausgelesen wird (bpsw Wiesbaden):
Code: Alles auswählen
<tr class="even" data-facilityid="1">
<td>
<a title="mehr Infos"> RMCC</a>
<div class="trafficParkingInfoBox" data-facilityid="1">
<table class="trafficParkingDetailTable">
<tr>
<td>Plätze insgesamt:</td>
<td>700</td>
</tr>
<tr>
<td>Öffnungszeiten:</td>
<td>
Durchgehend geöffnet
</td>
</tr>
</table>
</div>
</td>
<td>
<span style="color: #7aa200; font-weight: bold;">663</span>
</td>
</tr>
Code: Alles auswählen
<tr class="even" data-facilityid="CC">
<td>
<a title="mehr Infos">Collini Center</a>
<div class="trafficParkingInfoBox" data-facilityid="CC">
<table class="trafficParkingDetailTable">
<tr>
<td>Ein- und Ausfahrt:</td>
<td>Von der B 38 kommend, nach der Friedrich-Ebert-Brücke rechts ab, aber auf die linke Spur, am Neckar entlang und links in die 2. Einfahrt. Von der Innenstadt kommend auf dem Friedrichsring in die Collinistraße abbiegen, dann die erste Einfahrt links</td>
</tr>
<tr>
<td>Plätze insgesamt:</td>
<td>638</td>
</tr>
<tr>
<td>Öffnungszeiten:</td>
<td>24 Std. täglich (Tiefgarage Mo-Fr 5:30 bis 21:00 Uhr)</td>
</tr>
<tr>
<td>Einfahrtshöhen:</td>
<td>Tiefgarage: 2,00 m, Freigelände: 3,00 m</td>
</tr>
</table>
</div>
</td>
<td>
<span style="color: #7aa200; font-weight: bold;">317</span>
</td>
</tr>
Code: Alles auswählen
'NoneType' object has no attribute 'find_next_sibling'
Mein pythonCode ist aktuell dieser hier. Ich habe schon einen ErrorHandler eingebaut, damit der Code nicht abbricht, wenn dieses Problem auftaucht.
Code: Alles auswählen
response = requests.get(strURL)
soup = BeautifulSoup(response.text, 'html.parser')
results = soup.find_all('tr', {'class':['even', 'odd']})
for result in results:
# Each result is a new BeautifulSoup object.
# You can use the same methods on it as you did before.
title_elem = result.find('a', title='mehr Infos')
facilityid_elem = result.find('div', class_='trafficParkingInfoBox')
facilityid = facilityid_elem['data-facilityid']
#Tabelle da drin finden
tPD_table = result.find('table', class_='trafficParkingDetailTable')
ph_error = ""
try:
ph_plaetze_gesamt = tPD_table.find('td', text="Plätze insgesamt:").find_next_sibling('td').text
except AttributeError:
ph_error = 'Fehler: Kapazität nicht abrufbar.'
ph_plaetze_frei = result.find('span').text
ph_bel_p = ''
ph_frei_p = ''
ph_plaetze_gesamt = ''
ph_plaetze_belegt = ''
if ph_plaetze_frei.isnumeric():
ph_status = 'offen.'
else:
ph_status = ph_plaetze_frei
ph_plaetze_frei = ''
else:
ph_plaetze_gesamt = tPD_table.find('td', text="Plätze insgesamt:").find_next_sibling('td').text
ph_plaetze_frei = result.find('span').text
ph_bel_p = 0
ph_frei_p = 0
if ph_plaetze_frei.isnumeric():
ph_frei_p = round(float(ph_plaetze_frei) / float(ph_plaetze_gesamt),3)
ph_bel_p = round(1 - ph_frei_p,3)
ph_plaetze_belegt = float(ph_plaetze_gesamt) - float(ph_plaetze_frei)
ph_status = 'offen'
else:
ph_status = ph_plaetze_frei
ph_plaetze_frei = ''
ph_frei_p = ''
ph_bel_p = ''
ph_plaetze_belegt = ''
print(now.strftime('%Y-%m-%d %H:%M:%S') + '\t' + str(strcity) + '\t' + str(facilityid) + '\t' + str(ph_plaetze_gesamt) + '\t' + str(ph_plaetze_frei) + '\t' + str(ph_plaetze_belegt) + '\t' + str(ph_frei_p) + '\t' + str(ph_bel_p) + '\t' + title_elem.text.strip() + '\t' + str(ph_status) + '\t' + str(ph_error))