2017-01-11 7 views
2

Ich bekomme den Fehler AttributeError: 'NoneType' -Objekt hat kein Attribut 'findAll' jedes Mal, wenn ich das untenstehende Python-Skript ausführen. Ich habe einige Nachforschungen angestellt und ein paar Posts gefunden, die angeben, dass ich vielleicht "None" übergebe, wenn ich versuche, die Bilder zu finden, weshalb es Fehler gibt. Ich habe immer noch keine Lösung. Jede Information ist hilfreich. HierPython-Fehler beim Versuch, Image-Links abzurufen

ist der vollständige Fehler:

Traceback (most recent call last): 
    File "D:\Program Files\Parser Python\Test.py", line 33, in <module> 
    for img in divImage.findAll('img'): 
AttributeError: 'NoneType' object has no attribute 'findAll' 


    from bs4 import BeautifulSoup 

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
from selenium.common.exceptions import TimeoutException 
import os 

firefox_capabilities = DesiredCapabilities.FIREFOX 
firefox_capabilities['marionette'] = True 
firefox_capabilities['binary'] = 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe' 


os.environ["PATH"] += "C:\Python27\Lib\site-packages\selenium-2.53.6-py2.7.egg\selenium" 
#binary = FirefoxBinary('C:\Program Files (x86)\Mozilla Firefox\firefox.exe') 
driver = webdriver.Firefox(capabilities=firefox_capabilities) 
# it takes forever to load the page, therefore we are setting a threshold 
driver.set_page_load_timeout(5) 

try: 
    driver.get("http://readcomiconline.to/Comic/Flashpoint/Issue-1?id=19295&readType=1") 
except TimeoutException: 
    # never ignore exceptions silently in real world code 
    pass 

soup2 = BeautifulSoup(driver.page_source, 'html.parser') 
divImage = soup2.find('div', {"id": "divImage"}) 
#divImage = soup2.find('div', {"id": "containerRoot"}) 

# close the browser 
driver.close() 

for img in divImage.findAll('img'): 
    print img.get('src') 
+1

Hilft Ihnen dieses Thema? Link: http://stackoverflow.com/questions/18065768/python-attributeerror-nonetype-object-has-no-attribute-findall – Tenzin

+0

Dies könnte auch relevant sein http://stackoverflow.com/questions/31419641/python-scraper -unable-to-scrape-img-src. BTW warum das Java-Tag? – doctorlove

+0

Omg das war ein Unfall. Ich habe ursprünglich versucht, dies mit JSOUP in Java zu erreichen, also glaube ich, dass ich Java im Kopf habe. Entschuldigen Sie. –

Antwort

1

Der Fehler bedeutet, dass divImage ist None, was bedeutet, dass das div Element mit id="divImage" nicht in der geparsten HTML gefunden wurde.

Sie sollten zuerst warten, bis das gewünschte Element auf der Seite angezeigt wird und erst dann die Seitenquelle abrufen und analysieren.

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

# ... 

driver.get("http://readcomiconline.to/Comic/Flashpoint/Issue-1?id=19295&readType=1") 

wait = WebDriverWait(driver, 10) 
wait.until(EC.presence_of_element_located((By.ID, "divImage"))) 

soup2 = BeautifulSoup(driver.page_source, 'html.parser') 

Beachten Sie, dass warten, bis alle Bilder geladen werden, Sie kontinuierlich die Seite der Fußzeile bewegen sollte, bis alle Bilder geladen sind, Umsetzung: Dies kann mit WebDriverWait erfolgen

driver.get("http://readcomiconline.to/Comic/Flashpoint/Issue-1?id=19295&readType=1") 
wait.until(EC.presence_of_element_located((By.ID, "divImage"))) 

footer = driver.find_element_by_id("footer") 

while True: 
    # scroll to the footer 
    driver.execute_script("arguments[0].scrollIntoView();", footer) 
    time.sleep(0.5) 

    # check if all images are loaded 
    if all(img.get_attribute("src") for img in driver.find_elements_by_css_selector("#divImage p img")): 
     break 

Vergiss nicht import time.

+0

Das scheint den Trick getan zu haben. Das Laden der Seite dauert ziemlich lange, da viele Bilder angezeigt werden. Ich kann jetzt den 'src' Text ausdrucken, aber ich bekomme nur zwei Zeilen für zwei Bilder. Könnte das daran liegen, dass die anderen Bilder zu dieser Zeit ebenfalls nicht geladen waren? –

+0

@HunterZolomon guter Punkt, dieser Teil ist nicht so einfach, aktualisiert die Antwort - überprüfen Sie es. – alecxe

+0

Hmm jetzt erhalte ich diesen Fehler: selenium.common.exceptions.NoSuchElementException: Nachricht: Element konnte nicht gefunden werden: [id = "footer"] Ich kontrollierte die Webseite und dort ist sicher ein Element mit der ID von "Fußzeile" . –

Verwandte Themen