猿问

使用 Python 和 Selenium 进行抓取 - 如果元素不存在,我应该如何返回“null”

美好的一天,我是 Python 和 Selenium 的新手,并且已经搜索了一段时间的解决方案。虽然有些答案很接近,但我找不到可以解决我的问题的答案。我的代码片段是一个小问题,如下所示:


for url in links:

        driver.get(url)

        company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""")

        date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")

        title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")

        urlinf = driver.current_url #url info


        num_page_items = len(date)


        for i in range(num_page_items):

            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)

如果所有元素都存在(并且我可以看到 Pandas 数据帧的输出),这确实有效,但如果其中一个元素不存在(“日期”或“标题”),Python 会发出错误:


IndexError:列表索引超出范围


到目前为止我尝试过的:


1) 创建了一个 try/except (不起作用) 2) 尝试了 if/else (如果变量不是 "")


如果元素不存在,我想插入“Null”,以便在元素不存在的情况下用“Null”填充 Pandas 数据框。


任何帮助和指导将不胜感激。


编辑 1:


我尝试了以下方法:


for url in links:

        driver.get(url)

    try:

            company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""")

            date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")

            title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")

            urlinf = driver.current_url #url info

        except:

        pass

        num_page_items = len(date)


        for i in range(num_page_items):

            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)


在追加到 Pandas 时,我尝试了相同的尝试/除外。


编辑 2 我得到的错误:


IndexError:列表索引超出范围


归因于该行:


df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf[i]}, ignore_index=True)


PIPIONE
浏览 218回答 1
1回答

一只甜甜圈

由于您的错误显示您有索引错误!为了克服这个问题,您应该在引发此错误的区域内添加 try 除外。此外,您正在使用driver.current_url返回 URL 的 。但是在你的内部 for 循环中,你试图将它称为一个列表......这可能是你错误的根源......在你的情况下试试这个:for url in links:    driver.get(url)    company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""")    date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")    title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")    urlinf = driver.current_url #url info    num_page_items = len(date)    for i in range(num_page_items):        try:            df = df.append({'Company': company[i].text, 'Date': date[i].text, 'Title': title[i].text, 'URL': urlinf}, ignore_index=True)        except IndexError:            df.append(None) # or df.append('Null')希望你觉得这有帮助!
随时随地看视频慕课网APP

相关分类

Python
我要回答