AttributeError: 'NoneType' object has no attribute 'close'

做~自己de王妃 提交于 2020-01-04 14:22:10

问题


I am new to python js I am trying to run a project that are available on github

but when I am trying to run it gives following error

Traceback (most recent call last):   File "main.py", line 81, in
 <module>
     crawler_machine()   File "main.py", line 76, in crawler_machine
     driver.close()  AttributeError: 'NoneType' object has no attribute 'close' 
Exception AttributeError: "'Service' object has no attribute
 'process'" in <bound method Service.__del__ of
 <selenium.webdriver.phantomjs.service.Service object at 0x107d05790>>
 ignored

I follow all the instruction that are giving in that project

and the code is main.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

from config import URL_FORMAT, SCROLL_TIMES, PHANTOM_JS_PATH, WEBDRIVER
from parser import FParser
from optparse import OptionParser

import signal
import sys
import time

driver = None


def close(signal, frame):
    '''
    When you press Ctrl-C the browser closes
    '''
    global driver
    print('You pressed Ctrl+C!')
    driver.close()
    signal.pause()
    sys.exit(0)


def scroll_down(driver):
    '''
    This helps you to scroll the search results page to load more results
    '''
    for i in range(SCROLL_TIMES):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(0.3)


def get_page(driver, url):
    driver.get(url)
    return driver.page_source


def press_the_button_2_crawl(driver, keyword):
    """
    Main function handles everything 
    """
    html_data = get_page(driver, URL_FORMAT % keyword)
    scroll_down(driver)
    parser = FParser(html_data)
    parser.store() #store into db
    time.sleep(2)
def crawler_machine(search_word=None):

        global driver

        optparser = OptionParser()
        optparser.add_option("-s", "--search",
                        type="string", dest="search")
        (options, args) = optparser.parse_args()
        keyword = options.search or search_word
        print "Keyword",keyword
        try:
            try:
                #headless phantomjs for 32bit unix based machines
                driver =  webdriver.PhantomJS(executable_path=PHANTOM_JS_PATH)

            except:
                #firefox
                driver = webdriver.Firefox()


            signal.signal(signal.SIGINT, close)
            press_the_button_2_crawl(driver, keyword)

        finally:
             driver.close()   #line 76=================================



if __name__ == '__main__':

    crawler_machine()  #line 81=================================

回答1:


My guess would be that both attempts to create a driver - PhantomJS and FireFox - fail, meaning that driver is still None when you reach the finally block. You could confirm this by adding an explicit check:

    finally:
        if driver:
            driver.close()
        else:
            print "Could not create driver"

As to why driver creation would be failing, the most likely explanation is an installation problem. You can test this by running a trivial example in your Python environment:

>>> from selenium.webdriver import Firefox
>>> d = Firefox()
>>> d.get('http://stackoverflow.com')

If this doesn't open Firefox and navigate to the front page of Stack Overflow, check the Selenium documentation for your OS.




回答2:


driver isn't initialised if both the creation of PhantomJS and Firefox fail.

Add a check before closing:

if driver:
    driver.close()



回答3:


if both the try ...except clause failed in crawler_machine, the global value of driver will be None.



来源:https://stackoverflow.com/questions/31262908/attributeerror-nonetype-object-has-no-attribute-close

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!