2017-01-17 7 views
1

Ich prüfe die schönen Suppe Web Verschrottung Werkzeuge. Der folgende Code verbindet sich einfach mit einem Subreddit und versucht, den Link aller Bilder von den Benutzerposts auf der ersten Seite zu drucken.Python 2.7 - Schöne Suppe Web Scrapping find_all Befehl funktioniert nicht

import requests 
from bs4 import BeautifulSoup 

url = "https://www.reddit.com/r/pics" 
r = requests.get(url) 

if r.status_code != 200: 
    print "failed to connect" 
    exit() 

sourcecode = r.text 
soup = BeautifulSoup(sourcecode, "html.parser") 

print soup 

for tag in soup.find_all('a', {'class': 'title may-blank outbound srTagged'}): 
    print "entered into for loop" 

    if tag['href'].startswith('http'): 
     print tag['href'] 

Dieser Code bewirkt, dass das richtige soup Objekt gedruckt werden, und ich kann alles sehen. Der Befehl soup.find_all('a', {'class':'title may-blank outbound srTagged'}) gibt jedoch eine leere Liste zurück. Es gibt keinen Fehler, nur eine leere Liste, was bedeutet, dass die for-Schleife am Ende nicht einmal ausgeführt wird.

Ich frage mich, was hier falsch ist. Ich habe die Zeichenfolgen kopiert und eingefügt, und ich kann die Links sehen, die ich im Internetcode 1 drucken möchte.

Ich beziehe mich auf die Linie:

<a class = "title may-blank outbound srTagged" ... 

Was ich kopiert und an meinen Code beklebt Rechtschreibfehler zu vermeiden und immer noch nichts passiert ... irgendwelche Ideen, warum der Befehl eine leere Liste zurückgibt?

Ich habe die for-Schleife in for tag in soup.find_all('a', {'class': 'thumbnail may-blank outbound'}): geändert, das ist ein anderer Klassenname und es verhält sich normal.

Ist die Website gerade voll, um Beautiful Soup davon abzuhalten, auf diesen Teil des Quellcodes zuzugreifen?

+0

Möchten Sie den Verweis auf den Reddit-Thread oder auf den externen Speicherort des Bildes verweisen? – wpercy

+0

Ich ging für den Link zum externen Speicherort des Bildes (i.dailymail.co.uk .... etc). Die Idee wäre gewesen, eine Liste aller Bildverknüpfungen auf einer Reddit-Seite zu erstellen und sie dann durch eine separate Funktion zu leiten, die einfach alle Bilder aus der Liste der Links, die aus dem Code über – tdeoliveira05

Antwort

0

Zu allererst Sie differences between parsers auftreten, wechseln Sie zu einem milderen html5lib:

soup = BeautifulSoup(sourcecode, "html5lib") 

Dies muss html5lib installiert werden.

Sie können aber auch die Art und Weise vereinfachen Sie die Links Lokalisierung:

  • Verwendung CSS selectors und prüfen, ob title und outbound Klassen nur
  • prüfen nicht für href Werte mit http seit outbound Klasse zu starten implizit definiert es

Festgelegte Version:

for tag in soup.select('a.title.outbound'): 
    print(tag['href']) 
+0

ausgegeben werden sollten, herunterlädt ist super danke - immer noch lernen die Grundlagen, so dass alle Tipps zur Effizienz helfen! – tdeoliveira05

0

html.parser in Python2 gebrochen, und die BeautifulSoup Document erwähnt:

Wenn Sie können, empfehle ich Ihnen, und lxml für Geschwindigkeit nutzen installieren. Wenn Sie eine Version von Python 2 früher als 2.7.3 oder eine Version von Python 3 früher als 3.2.2 verwendet wird, ist es wichtig, dass Sie installieren lxml oder html5libPythons eingebauten HTML-Parser ist einfach nicht sehr gut in ältere Versionen.

Beachten Sie, dass wenn ein Dokument ungültig ist, verschiedene Parser verschiedene Beautiful Soup Bäume dafür generieren. Einzelheiten finden Sie unter Differences between parsers.

+0

War nicht bewusst, danke! – tdeoliveira05