Selenium/Beauty Soup刮刀在循环一页后失败(Javascript)

Selenium/Beauty Soup刮刀在循环一页后失败(Javascript),javascript,python,selenium,web-scraping,beautifulsoup,Javascript,Python,Selenium,Web Scraping,Beautifulsoup,我试图从《季节性食品指南》中搜集有关食品季节性的数据,但遇到了一个障碍。该网站有一个相当简单的URL结构: 我已经能够使用Selenium和Beautiful Soup成功地从一个页面中获取季节性信息,但是在随后的循环中,我要查找的文本部分实际上没有加载,因此我得到了AttributeError:“NoneType”对象没有属性“text”。我知道这是因为months\u list\u raw返回为空,因为页面的'wheel-months-list'部分没有加载到第二个循环中。代码如下。有什么

我试图从《季节性食品指南》中搜集有关食品季节性的数据,但遇到了一个障碍。该网站有一个相当简单的URL结构:

我已经能够使用
Selenium
Beautiful Soup
成功地从一个页面中获取季节性信息,但是在随后的循环中,我要查找的文本部分实际上没有加载,因此我得到了
AttributeError:“NoneType”对象没有属性“text”
。我知道这是因为
months\u list\u raw
返回为空,因为页面的
'wheel-months-list'
部分没有加载到第二个循环中。代码如下。有什么想法吗

for ingredient in produce_list:
    for state in state_list:

        # grab page content
        search_url = 'https://www.seasonalfoodguide.org/{}/{}'.format(ingredient,state)
        driver.get(search_url)
        page_soup = soup(driver.page_source, 'lxml')

        # grab list of months
        months_list_raw = page_soup.find('p',{'id':'wheel-months-list'})
        months_list = months_list_raw.text

为了防止错误发生并继续循环,您需要检查
months\u list\u raw
元素何时不是
None
。看起来有些product页面没有某些状态的任何数据,所以您需要在程序中按照自己的方式处理这些数据

for ingredient in produce_list:
    for state in state_list:
        # grab page content
        search_url = 'https://www.seasonalfoodguide.org/{}/{}'.format(ingredient,state)
        driver.get(search_url)
        page_soup = soup(driver.page_source, 'lxml')

        # grab list of months
        months_list_raw = page_soup.find('p',{'id':'wheel-months-list'})
        if months_list_raw is not None:
            months_list = months_list_raw.text
        else:
            # Handle case where ingredient/state data doesn't exist

该页面在客户端呈现,这意味着当您打开该页面时,将向后端服务器发出另一个请求,以根据您选择的筛选器获取数据。所以问题是,当您打开页面并阅读HTML时,内容尚未完全加载。您可以做的最简单的事情是在使用Selenium打开页面后睡眠一段时间,以等待页面完全加载。我已经通过在
驱动程序.get(搜索url)
之后加入
time.sleep(3)
测试了你的代码,它工作得很好。

你是否验证了它试图加载的页面(食物/状态组合)在崩溃时是否确实存在?似乎错误在于某些页面不存在html对象。这不是我标记的问题的根本原因,但我忘记了添加它。谢谢你叫出来