使用 Python 和 Selenium 进行抓取 - 如果元素不存在,我应该如何 return a 'null'

Scraping with Python and Selenium - how should I return a 'null' if element not present

美好的一天, 我是 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 数据帧的输出),但如果其中一个元素不存在('date' 或 'title') Python 发出错误:

IndexError: list index out of range

到目前为止我尝试过的:

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

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

如有任何帮助和指导,我们将不胜感激。

编辑 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)

和:

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 (NoSuchElementException, ElementNotVisibleException, InvalidSelectorException):
        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)

和:

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:
          i = 'Null'
          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 时尝试了相同的 try/except。

编辑 2 我得到的错误:

IndexError: list index out of range

归因于行:

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

因为你的错误显示你有一个索引错误!

要解决这个问题,您应该在引发此错误的区域内添加尝试。

此外,您正在使用 driver.current_url,其中 returns 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')

希望这对您有所帮助!