2016-12-21 2 views
0

Ich lerne gerade von einem Python-Tutorial von Udemy (total Newbie zu Python). Ich bin derzeit in einer schönen Suppe Abschnitt, wo wir mit einer Übung beschäftigt sind, um den Preis aus dem Buch des Autors auf Amazon zu kratzen. Mein Code ist unten:Python - Schöne Suppe Wählen Sie nur zurück []

import bs4, requests 
url = 'https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/' 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 

response = requests.get(url, headers=headers) 
response.raise_for_status() 
soup = bs4.BeautifulSoup(response.text, 'html.parser') 
soup.select('#addToCart > a > h5 > div > div.a-column.a-span4.a-text-right.a-span-last > span.a-size-medium.a-color-price.header-price') 

Wenn ich den Pfad des Elements des Preises kontrollieren, ich kann das sehen:

<span class="a-size-medium a-color-price header-price"> 


      $25.45 



    </span> 

Allerdings, wenn ich es kopieren und einfügen von der soup.select und führen Sie den Python-Befehl, ich bin nur mit einem [] dh 2 eckigen Klammern zurückgegeben. Ich sollte den Inhalt der zweiten Code-Box bekommen.

UPDATE: Während der Zeit, die ich die Frage eintippte, zeigte es das Ergebnis korrekt, der Inhalt der Box mit 25,45 $, aber 5 Minuten später ging es zurück, um nur das Ergebnis der [] Klammern zu erhalten. Ich bin hinter einem Proxy und habe versucht, ohne einen Proxy durchzugehen, ohne Ergebnis zu ändern. Ich bekomme auch keinen Fehler, wenn ich response.raise_for_status() mache. Bitte kann jemand helfen?

(Denken Sie daran, dass ich nicht die Absicht, da draußen jede kommerzielle Website zu screenen kratzen, würde ich sehr gerne meine Learnings zu Inhouse-Szenarien anwenden)

Vielen Dank!

Antwort

1

Sie sind überkomplizieren Sie Ihre CSS-Selektor und machen es fragile - stark abhängig von dem Seitenlayout. Sie müssen nicht durch die vollständige Eltern-Kind-Kette gehen, um ein Element zu finden. Wählen Sie die zuverlässigsten, lesbarsten und geeignetsten Punkte aus, auf denen Sie Ihren Locator aufbauen können. Zum Beispiel, in diesem Fall die folgenden Werke für mich:

soup.select('#addToCart .header-price') 
+0

Danke, tut dies –

+0

soup.select ('span.a-size-Medium.Verfahren-color-price.header-Preis') arbeitet hat auch für mich funktioniert –