Как продолжить сценарий, даже если на текущей странице отсутствует элемент? - PullRequest
1 голос
/ 16 июня 2020

Я работаю над проектом по очистке и пытаюсь очистить много разных профилей. Не все профили содержат одинаковую информацию, поэтому я хочу пропустить эту часть данных, если в текущем профиле ее нет. Вот мой текущий код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep


driver = webdriver.Chrome("MY DIRECTORY")
driver.get("https://directory.bcsp.org/")
count = int(input("Number of Pages to Scrape: "))

body = driver.find_element_by_xpath("//body") #
profile_count = driver.find_elements_by_xpath("//div[@align='right']/a")

while len(profile_count) < count: # Get links up to "count"
    body.send_keys(Keys.END)
    sleep(1)
    profile_count = driver.find_elements_by_xpath("//div[@align='right']/a")

for link in profile_count: # Calling up links
    temp = link.get_attribute('href') # temp for
    driver.execute_script("window.open('');") # open new tab
    driver.switch_to.window(driver.window_handles[1]) # focus new tab
    driver.get(temp)


    ##### SCRAPE CODE #####
    Name = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[1]/div[2]/div')

    IssuedBy = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[1]/td[1]/div[2]')

    CertificationNumber = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[1]/td[3]/div[2]')

    CertfiedSince = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[3]/td[1]/div[2]')

    RecertificationCycle = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[3]/td[3]/div[2]')

    Expires = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[5]/td[1]/div[2]')

    AccreditedBy = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[5]/td[3]/div[2]/a')

    print(Name.text + " : " + IssuedBy.text + " : " + CertificationNumber.text + " : " + CertfiedSince.text + " : " + RecertificationCycle.text + " : " + Expires.text + " : " + AccreditedBy.text)


    driver.close()
    driver.switch_to.window(driver.window_handles[0])
driver.close()

Пожалуйста, дайте мне знать, как я могу пропустить элемент, если он отсутствует в текущем профиле.

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Согласно документам , find_element_by_xpath() вызывает NoSuchElementException, если элемент, который вы ищете, не может быть найден.

Я предлагаю обработку потенциал NoSuchElementExceptions соответственно. Как может выглядеть правильная обработка исключений, зависит от того, чего вы пытаетесь достичь, вы можете зарегистрировать ошибку, присвоить значения по умолчанию, пропустить определенные последующие действия ...

try:
    Name = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[1]/div[2]/div')
except NoSuchElementException:
    Name = "Default Name"

Вы могли бы даже обернуть несколько вызовов find_element_by_xpath() в блок try.

1 голос
/ 16 июня 2020

Это исправит try:.. except:.., но у вас есть и другие ошибки. Я исправил их все. Код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep


driver = webdriver.Chrome('chromedriver')
driver.get("https://directory.bcsp.org/")
count = int(input("Number of Pages to Scrape: "))

body = driver.find_element_by_xpath("//body") #
profile_count = driver.find_elements_by_xpath("//div[@align='right']/a")
c = 1
while c <= count:
    for link in profile_count: # Calling up links
        temp = link.get_attribute('href') # temp for
        driver.execute_script("window.open('');") # open new tab
        driver.switch_to.window(driver.window_handles[1]) # focus new tab
        driver.get(temp)
        sleep(1)
        ##### SCRAPE CODE #####
        try:
            Name = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[1]/div[2]/div')

            IssuedBy = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[1]/td[1]/div[2]')

            CertificationNumber = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[1]/td[3]/div[2]')

            CertfiedSince = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[3]/td[1]/div[2]')

            RecertificationCycle = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr/td[5]/div/table[1]/tbody/tr/td[3]/table/tbody/tr[3]/td[3]/div[2]')
        except:
            c -= 1
        driver.switch_to.window(driver.window_handles[0])
        c += 1
        if c > count:
            break
driver.quit()
...