Parsing JSON mit Beautiful Soup

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen,

Ich versuche aus einem JSON mittels BeautifulSoup bestimmte Inhalte wie z.B. den Deeplink zu crawlen. Leider klappt das nicht wie gewünscht:


Das ist mein bisherige Logik:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
import json
from urllib.request import urlopen
import urllib.request

response = urlopen("http://www.getyourguide.de/s/search.json?q=London&page=8")

content = response.read()
soup = BeautifulSoup(content,'html.parser',from_encoding='utf-8')
newDictionary = json.loads(str(soup))['activities']
deeplink = soup.find_all('a',href=True)
print(Deeplink)
Resultat ist:

Dies ist der JSON Snippet, aus dem ich versuche den Deeplink zu crawlen:

Code: Alles auswählen

article data-href="http://www.getyourguide.de/london-l57/london-private-tour-stonehenge-salisbury-kathedrale-t43089/" id="t43089" class="activity-card activity-card-horizontal
">
<div class="activity-card-content">
<a class="activity-card-link" href="http://www.getyourguide.de/london-l57/london-private-tour-stonehenge-salisbury-kathedrale-t43089/">
<div class="activity-card-image-container">
<img src="http://img.getyourguide.com/img/tour_img-252768-70.jpg" data-role="cover" alt="" />
</div>
<div class="activity-card-details">
<header class="activity-card-header">
<h3 class="activity-card-title">
London: Private Tour Stonehenge & Salisbury-Kathedrale
</h3>
</header>
<p class="activity-small-description">Entdecken Sie während dieser 6-stündigen Tour nach Stonehenge eines der Wunder der prähistorischen Welt und bewundern Sie diesen mysteriösen…</p>
<div class="activity-info activity-duration">
<span class="activity-info-label activity-duration-label">
Dauer:
</span>
<span class="activity-info-value activity-duration-value">
6 Stunden
</span>
</div>
</div>
<div class="activity-card-actions">
<div class="activity-card-price-tag has-cta-A">
<span class="from">Ab</span>
<span class="price">
€&nbsp;154
</span>
</div>
<a href="http://www.getyourguide.de/london-l57/london-private-tour-stonehenge-salisbury-kathedrale-t43089/#booking-assistant" class="btn btn-small btn-booking prominent-cta prominent-cta-A">


Kann mir jemand sagen, was ich falsch mache? Vielen Dank für euer Feedback:)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun, weder ist das JSON, noch ist BS fuer geeignet JSON zu parsen.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@SeriousRuffy: Du solltest doch als erste mal schauen, was Du da zurückbekommst. Der Name 'search.json' könnte schon ein erster Hinweis sein. Jetzt mußt Du nur noch json laden und BeautifulSoup in die richtige Reihenfolge bringen.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Danke für euer Feedback. Habe es nun geschafft:

Code: Alles auswählen

response = urllib.request.urlopen("http://www.getyourguide.com/s/search.json?q=Siem+Reap&page=" + str(page))
 jsondata = json.loads(response.read().decode("utf-8"))
 format = (jsondata['activities'])
 g_data = format.strip("'<>()[]\"` ").replace('\'', '\"')
 soup = BeautifulSoup(g_data)

hallo = soup.find_all("article", {"class": "activity-card activity-card-horizontal "})
for item in hallo:
        headers = item.find_all("h3", {"class": "activity-card-title"})
        for header in headers:
            header_final = header.text.strip()
BlackJack

@SeriousRuffy: Zeile 4 erscheint mir nicht nur überflüssig sondern sogar ”zerstörerisch” weil es aus einzelnen Anführungszeichen, die in Texten auch als Apostroph verwendet werden, doppelte Anführungszeichen macht und so Beispielsweise aus „St. Paul's Cathedral“ dann „St. Paul"s Cathedral“ wird, was falsch ist.

Ich weiss auch nicht so recht was das `strip()` davor soll. Hast Du mal ein Beispiel für Daten bei denen da jemals etwas anderes als '<>' überhaupt zum tragen kommt? Und *das* wird dann von `BeautifulSoup` sowieso wieder repariert damit die Tags stimmen.

Gibt es Artikel mit mehr als einer Überschrift? Laut Code ja, praktisch wohl eher nicht.
Antworten