为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2021-08-24 19:10:56
美好的一天,我是 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)
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

由于您的错误显示您有索引错误!


为了克服这个问题,您应该在引发此错误的区域内添加 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')

希望你觉得这有帮助!


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号