2015-06-04 3 views
1

Я использую try/except для проверки на наличие xpath альтернативных источников для ввода переменных с веб-сайта.Сокращение выражения для обработки исключений Python

Это нужно будет делать много раз, поэтому я ищу способ сократить выражение. Может быть, менеджер контекста может каким-то образом использоваться?

В этом примере я проверяю наличие двух альтернативных источников xpath для переменных issuer и name.

try: 
    xpath_issuer = ".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]" 
    find_issuer = driver.find_element_by_xpath(xpath_issuer) 
    issuer = re.search(r"(.+)", find_issuer.text).group() 
except NoSuchElementException: 
    pass 
try: 
    xpath_issuer = ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a" 
    find_issuer = driver.find_element_by_xpath(xpath_issuer) 
    issuer = re.search(r"(.+)", find_issuer.text).group() 
except NoSuchElementException: 
    pass 
try: 
    xpath_name = ".//*[@id='cols']/div[1]/div[1]/h1" 
    find_name = driver.find_element_by_xpath(xpath_name) 
    name = re.search(r"(.+)", find_name.text).group() 
except NoSuchElementException: 
    pass 
+0

Определить функцию, которая принимает выражение XPath и содержит попытку/за исключением того кода, как показано на http://stackoverflow.com/a/12150013/423105. Не возвращать ли он None при возникновении исключения NoSuchElementException. Вызовите функцию три раза, используя три разных выражения XPath ... но остановитесь, если функция возвращает результат, отличный от None. – LarsH

ответ

2

Как об этом:

listXPath = [".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]", ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a", ".//*[@id='cols']/div[1]/div[1]/h1"] 
class Work(): 
    def __init__(self): 
     self.getIssuer() 

    def getIssuer(self): 
     for i in range(len(listXPath)): 
      xPath = listXPath[i] 
      try: 
       find_issuer = driver.find_element_by_xpath(xpath_issuer) 
       issuer = re.search(r"(.+)", find_issuer.text).group() 
      except: 
       pass 

# Run clas 
Work() 

Вы, кажется, есть 3 различных вариантов xpath_issuer так что вы Переберите все из них. то вы установили find_issuer. После этого вы делаете что-то с issuer.

Возможно, вы попытаетесь позволить issuer вернуть что-то, что будет указывать, если что-то найдено. Если вы пройдете issuer, очевидно, это сработало, а затем выполните оператор return.

Например:

listXPath = [".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]", ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a", ".//*[@id='cols']/div[1]/div[1]/h1"] 
class Work(): 
    def __init__(self): 
     x = self.getIssuer() 
     print(x) 

    def getIssuer(self): 
     for i in range(len(listXPath)): 
      xPath = listXPath[i] 
      try: 
       find_issuer = driver.find_element_by_xpath(xpath_issuer) 
       issuer = re.search(r"(.+)", find_issuer.text).group() 
       return 'DoneIt' 
      except: 
       pass 

# Run clas 
Work() 
+0

Я вижу, что третий в вашем примере - это что-то еще «эмитент». Я думаю, что мой пример все равно даст вам представление. Тогда вы также можете сделать 2 разных определения. Один для «эмитента» и один для «имени». – Tenzin

+0

Я пробовал ваше решение, но я получаю 'NameError: глобальное имя 'issuer' не определено'. Любая идея почему? Это происходит, когда он пытается передать «эмитент» из цикла. Пока он находится в цикле, он может найти 'эмитента'. – Winterflags

+0

Кажется, что он успешно запускает 'try', но тогда он также всегда запускает' except' также, и это отрицает все, поэтому в 'issuer' ничего не передается. Может быть, это правильно? – Winterflags