Seite 1 von 1

Parsing JSON mit Beautiful Soup

Verfasst: Freitag 9. Oktober 2015, 12:03
von SeriousRuffy
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:)

Re: Parsing JSON mit Beautiful Soup

Verfasst: Freitag 9. Oktober 2015, 12:32
von cofi
Nun, weder ist das JSON, noch ist BS fuer geeignet JSON zu parsen.

Re: Parsing JSON mit Beautiful Soup

Verfasst: Freitag 9. Oktober 2015, 13:03
von Sirius3
@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.

Re: Parsing JSON mit Beautiful Soup

Verfasst: Montag 12. Oktober 2015, 13:43
von SeriousRuffy
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()

Re: Parsing JSON mit Beautiful Soup

Verfasst: Montag 12. Oktober 2015, 15:48
von 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.