Selenium/Beautiful Soup scraper在循环一页后失败(Javascript)

2024-03-28 23:58:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

https://www.seasonalfoodguide.org/produce_name/state_name

我已经能够使用SeleniumBeautiful Soup成功地从一个页面中获取季节性信息,但是在随后的循环中,我要查找的文本部分实际上没有加载,所以我得到了AttributeError: 'NoneType' object has no attribute 'text'。我知道这是因为months_list_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

Tags: namehttpsorg食品rawwwwpage页面
2条回答

该页在客户端呈现,这意味着当您打开该页时,会向后端服务器发出另一个请求,以根据您选择的筛选器获取数据。所以问题是,当您打开页面并阅读HTML时,内容还没有完全加载。你可以做的最简单的事情就是在用Selenium打开页面后睡眠一段时间,等待页面完全加载。我通过在driver.get(search_url)之后插入time.sleep(3)来测试您的代码,它运行得很好。你知道吗

为了防止错误发生并继续循环,您需要检查months_list_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

相关问题 更多 >