Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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和Selenium:根据是否存在某些内容自动调整范围_Python_List_Selenium_Range - Fatal编程技术网

Python和Selenium:根据是否存在某些内容自动调整范围

Python和Selenium:根据是否存在某些内容自动调整范围,python,list,selenium,range,Python,List,Selenium,Range,关于Stackoverflow的第一篇帖子,这个网站在过去对我非常有用,所以首先要感谢社区。在过去的2-3周里,我一直在学习Python,只是通过自己的小“项目”,我有一个问题,我试图搜索,但不确定如何表达,所以找到答案有点困难 基本上,我想做的是为一个神奇宝贝获取一个用户输入,去一个有相关信息的网站,打印一张神奇宝贝可以通过升级学习的动作表。我已经成功地运行了一段代码,但是,我遇到的问题是,每个神奇宝贝学习不同数量的动作。我的密码是: import selenium.webdriver as

关于Stackoverflow的第一篇帖子,这个网站在过去对我非常有用,所以首先要感谢社区。在过去的2-3周里,我一直在学习Python,只是通过自己的小“项目”,我有一个问题,我试图搜索,但不确定如何表达,所以找到答案有点困难

基本上,我想做的是为一个神奇宝贝获取一个用户输入,去一个有相关信息的网站,打印一张神奇宝贝可以通过升级学习的动作表。我已经成功地运行了一段代码,但是,我遇到的问题是,每个神奇宝贝学习不同数量的动作。我的密码是:

import selenium.webdriver as webdriver

def moves(x):
        move = browser.find_element_by_xpath("""//*[@id="svtabs_moves_15"]/div[1]/div[1]/div[1]/table/tbody/tr[""" + str(x) + """]/td[2]/a""").text
        return(move)              

poke = input("Search for which Pokémon?: ")
browser = webdriver.PhantomJS()
browser.get("https://pokemondb.net/pokedex/" + str(poke))
for x in range(1,50):
    print(moves(x))
如果一个神奇宝贝只有15个移动,那么在x的第16次迭代中,会返回一个错误,因为xpath不存在,因此我正在寻找一种方法来修改我的代码,以便在xpath不存在时停止打印

我在考虑使用
while True
语句,但不太确定如何处理它。同样,我对Python非常陌生,因此代码可能不是最优雅的


谢谢你的阅读

这里最简单的选项是添加
try except
以传递错误而不中断循环:

...
(your code above)
while 1: #initially was for x in range(1,50), but while loop is better
    try:
        print(moves(x))
    except:
        break

while循环
try except语句一起使用
。因此,如果元素不存在,它只会停止循环

def moves(x):
    while True:
        try:
            move = browser.find_element_by_xpath("""//*[@id="svtabs_moves_15"]/div[1]/div[1]/div[1]/table/tbody/tr[""" + str(x) + """]/td[2]/a""").text
        except:
            break
        return(move) 

如果每个移动之间的差异在
标记中,您可以找到所有这些元素的列表,并使用它来获取您要查找的数据

def moves(element):
    move = element.find_element_by_xpath('//*td[2]/a').text
    return(move)              

browser.get("https://pokemondb.net/pokedex/" + str(poke))
moves_list = browser.find_element_by_xpath("""//*[@id="svtabs_moves_15"]/div[1]/div[1]/div[1]/table/tbody/tr[""" + str(x) + """]""")
for x in range(1, len(moves_list)):
    print(moves(moves_list[x]))

谢谢你,这在路上帮了我的忙!我仍然得到了一堆超出有效范围的“None”,但添加了一个if语句来解决这个问题:)乐意帮忙:)