Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 缩短Python异常处理的表达式_Python 2.7_Xpath_Exception Handling_Contextmanager - Fatal编程技术网

Python 2.7 缩短Python异常处理的表达式

Python 2.7 缩短Python异常处理的表达式,python-2.7,xpath,exception-handling,contextmanager,Python 2.7,Xpath,Exception Handling,Contextmanager,我正在使用try/except检查xpath替代源,以便从网站输入变量 它将不得不这样做很多次,所以我正在寻找一种缩短表达式的方法。也许可以使用上下文管理器 在本例中,我正在检查变量issuer和name的两个可选xpath源 try: xpath_issuer = ".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]" find_issue

我正在使用
try
/
except
检查
xpath
替代源,以便从网站输入变量

它将不得不这样做很多次,所以我正在寻找一种缩短表达式的方法。也许可以使用上下文管理器

在本例中,我正在检查变量
issuer
name
的两个可选xpath源

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
这个怎么样:

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()
对于
xpath\u发行者
,您似乎有3个不同的选项,因此您可以循环所有这些选项。然后设置
find_issuer
。之后,您可以使用
issuer
执行一些操作

也许您可以尝试让
issuer
返回一些指示是否找到某些内容的内容。如果您传递了
issuer
显然有效,那么执行返回语句

例如:

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()

我看到您示例中的第三个是另一个
发行人
。我想我的例子仍然会给你一个想法。你也可以做出两种不同的定义。一个用于
发卡机构
,一个用于
名称
。我尝试了您的解决方案,但得到了
名称错误:未定义全局名称“发卡机构”
。知道为什么吗?当它试图将
issuer
从循环中传递出去时,就会发生这种情况。只要它在循环中,它就可以找到
颁发者
。它似乎成功地运行了
try
,但除了之外,它也总是运行
,这会否定所有内容,因此在
颁发者
中不会传递任何内容。这是对的吗?我真的不知道
issuer
应该做什么?
issuer
是我以后要写入csv的变量。它是通过
find_issuer
中的
re.search
提取出来的,后者又来自xpath。定义一个函数,该函数采用xpath表达式并包含try/except代码,如中所示。当发生NoTouchElementException时,让它返回None。使用三个不同的XPath表达式调用函数三次。。。但如果函数返回的结果不是None,则停止。