boguslaw-de-cubalibre
#python #beautifulsoup

Próbuję łapać cenę randomowego produktu na amazonie i program działa..., a czasami nie działa. Wywala błąd:

title = soup.find(id='productTitle').gettext()
AttributeError: 'NoneType' object has no attribute 'get
text'

Co dziwne, ten błąd wywala tylko czasami.... :| Znam znaczenie błędu, ale nie rozumiem dlaczego czasami znajduje productTitle, a czasami nie... :| Ktoś coś?
  • Najlepsze
  • Wszystkie komentarze
ProfesorBigos
@boguslaw-de-cubalibre: dodaj sobie obsługę wyjątku, żeby przy wystąpieniu błędu zapisywało treść strony i wtedy będziesz mógł sprawdzić, czy serwer zwraca to, czego oczekujesz
alfabetaborzy
@boguslaw-de-cubalibre: na przyszłość kod w pastebina wrzucaj, będzie czytelniejszy.

Generalnie, błąd wyskakuje przez to, że find() zwraca wartość NoneType, bo nic nie może znaleźć.
Odpaliłem ten kod no i ogólnie to wygląda tak jakby nie każdy request zdążył załadować wszystkie elementy strony. Odpaliłem ten sam skrypt, tylko przerobiłem go tak by źródło strony pobierał przy pomocy Selenium - tytuł i cenę zwraca za każdym wykonaniem pętli.
Z tego co się orientuje, jak strona
boguslaw-de-cubalibre
@krolik1337: to wykop zmienił bo tam jest podkreślenie _
alfabetaborzy
C.....t
C.....t
to wykop zmienił bo tam jest podkreślenie _


@boguslaw-de-cubalibre: dlatego zawsze na wykopie lepiej podawać link do pastebina, github gist czy innej usługi do udostępniania kodu, bo wykop pod tym względem ssie
alfabetaborzy
@boguslaw-de-cubalibre: właśnie szukałem jakiegoś rozwiązania, niby piszą żeby dać time.sleep(5) przed inicjalizacją bs4 ale to nic nie daje, więc większość rozwiązań to właśnie używanie selenium
boguslaw-de-cubalibre
@alfabetaborzy: dzięki za sprawdzenie. Wracam do uczenia się, a w moim wieku to nie takie łatwe xD
alfabetaborzy
@boguslaw-de-cubalibre: a to kolejna rzecz do sprawdzenia, uruchomienie selenium na serwerze ( ͡° ͜ʖ ͡°)
alfabetaborzy
@boguslaw-de-cubalibre: więcej kodu by się przydało
boguslaw-de-cubalibre
@alfabetaborzy: Tylko się nie śmiej :-)

import requests
from bs4 import BeautifulSoup
from datetime import datetime
krolik1337
@boguslaw-de-cubalibre: nie znam tej biblioteki ale raz masz gettext() a raz get_text()
boguslaw-de-cubalibre
@ProfesorBigos: nie bardzo wiem jak to zrobić, ale rano będę kopać. Dzięki. Odezwę się jak coś mi się uda ( ͡° ͜ʖ ͡°)
boguslaw-de-cubalibre
@alfabetaborzy: hejka, dzięki wielkie. Doinstalowałem selenium i webdriver i działa poprawnie. Nie wiesz może jak wymusić na samym beautifulsoup, aby załadował stronę zanim zacznie szukać? Selenium działa, ale potrzebuje Chrome do funkcjonowania, beautifulsoup działa "w tle".
boguslaw-de-cubalibre
@alfabetaborzy: mam jeszcze jeden pomysł, ale niestety nie wychodzi mi jego realizacja. Jak wykorzystać try / except, aby pomimo błędu beautifulsoup ponawiało zapytanie, aż do końca pętli?
alfabetaborzy
@boguslaw-de-cubalibre: próbowałeś dodać finally: na końcu?
boguslaw-de-cubalibre
boguslaw-de-cubalibre Autor
  • adult
0
Treść przeznaczona dla osób powyżej 18 roku życia...
alfabetaborzy
@boguslaw-de-cubalibre: no to nie pozostaje nic innego jak selenium, jak cię irytuje ciągle otwierająca się przeglądarka to ponoć jest takie coś jak driver PhantomJS, które wykonuje się w tle https://sqa.stackexchange.com/questions/2609/running-webdriver-without-opening-actual-browser-window ale osobiście nie sprawdzałem tego jak to działa
boguslaw-de-cubalibre
@alfabetaborzy: przetestuję, dzięki :) Sama przeglądarka mnie nie irytuje, ale jakbym chciał uruchomić kod na jakimś serwerze to nie wiem jak by to niby miało działać...