python - Python写错行
问题描述
我正在编写一个将一些客户端代码发送到页面的刮板,如果代码是正确的,它必须在工作表上写下将加载的页面的一些信息。如果客户端代码错误,那么它必须转到工作表上的下一个代码。
同一张表发送和接收信息。客户代码在第一列,每个人都有自己的行来获取信息。
问题在于,如果客户端代码错误,则代码在编写先前在页面上获取的信息时不会忽略该行。所以最后我得到了写在有序行(2、3、4、5....)上的所有信息,而没有跳过它们(如果客户端代码没有返回任何信息,应该跳过女巫)。
k_bot.py
def search_cpfs(self):
# SEARCH THROUGH THE LIST OF CLIENT CODES (1ST COLUMN OF THE SPREADSHEET), AND OBTAIN THESE INFO
nomes = []
idades = []
beneficios = []
concessoes = []
salarios = []
bancoss = []
bancoscard = []
consigs = []
cards = []
for cpf in self.cpfs:
print(f"Procurando {cpf}.")
self.driver.get(self.bot_url)
#IF THE CLIENT CODE IS RIGHT
try:
cpf_input = self.driver.find_element_by_xpath('//*[@id="search"]/div/div[1]/input')
cpf_input.send_keys(cpf)
cpfButton = self.driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
cpfButton.click()
time.sleep(2)
self.delay = 2 # seconds
nome = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[1]/div[1]/h2").text
idade = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[1]/div[1]/ul/li[2]").text
age = re.search(r'\((.*?)Anos', idade).group(1)
beneficio = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[1]/div[2]/div[5]/span/b").text
concessao = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[1]/div[2]/div[2]/span").text
salario = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[2]/div/div[3]/div[1]/div[1]/span").text
bancos = self.driver.find_element_by_xpath('//*[@id="loans"]').text
bancosw = re.findall(r'(?<=Banco )(\w+)', bancos)
bankslist = ', '.join(bancosw)
bancocard = self.driver.find_element_by_xpath('//*[@id="cards"]').text
bcardw = re.findall(r'(?<=Banco )(\w+)', bancocard)
bcardlist = ', '.join(bcardw)
consig = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[3]/div[2]/span").text
card = self.driver.find_element_by_xpath(
"/html/body/main[1]/div[1]/div[1]/div[3]/div[3]/span").text
print('CPF Valido')
print(nome, age, beneficio, concessao, salario, bankslist, bcardlist, consig, card)
# IF THE CLIENT CODE IS WRONG
except (NoSuchElementException, UnexpectedAlertPresentException):
print('CPF Invalido')
continue
nomes.append(nome)
idades.append(age)
beneficios.append(beneficio)
concessoes.append(concessao)
salarios.append(salario)
bancoss.append(bankslist)
bancoscard.append(bcardlist)
consigs.append(consig)
cards.append(card)
return nomes, idades, beneficios, concessoes, salarios, bancoss, bancoscard, consigs, cards
cpf_updater.py
class CpfSearch(object):
def __init__(self, spreadsheet_name):
self.cpf_col = 1
self.nome_col = 2
self.age_col = 3
self.beneficio_col = 4
self.concessao_col = 5
self.salario_col = 6
self.bancos_col = 7
self.bancocard_col = 8
self.consig_col = 9
self.card_col = 15
scope = ['https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive.readonly']
creds = ServiceAccountCredentials.from_json_keyfile_name('CONSULTAS.json', scope)
client = gspread.authorize(creds)
self.sheet = client.open(spreadsheet_name).sheet1
def process_cpf_list(self):
# SKIP OVER COLUMN HEADING IN THE SPREADSHEET
cpfs = self.sheet.col_values(self.cpf_col)[1:]
bot_url = BOT(cpfs)
nomes, idades, beneficios, concessoes, salarios, bancoss, bancoscard, consigs, cards = bot_url.search_cpfs()
# UPDATE THE SHEET
print("Atualizando...")
for cpfs in range(len(nomes)):
self.sheet.update_cell(cpfs + 2, self.nome_col, nomes[cpfs])
self.sheet.update_cell(cpfs + 2, self.age_col, idades[cpfs])
self.sheet.update_cell(cpfs + 2, self.beneficio_col, beneficios[cpfs])
self.sheet.update_cell(cpfs + 2, self.concessao_col, concessoes[cpfs])
self.sheet.update_cell(cpfs + 2, self.salario_col, salarios[cpfs])
self.sheet.update_cell(cpfs + 2, self.bancos_col, bancoss[cpfs])
self.sheet.update_cell(cpfs + 2, self.bancocard_col, bancoscard[cpfs])
self.sheet.update_cell(cpfs + 2, self.consig_col, consigs[cpfs])
self.sheet.update_cell(cpfs + 2, self.card_col, cards[cpfs])
cpf_updater = CpfSearch('TESTE')
cpf_updater.process_cpf_list()
解决方案
问题:
您正在使用列表nomes
、idades
、beneficios
等来存储要写入工作表的数据。这些列表只是一系列值,不包含关于应该属于哪个值的行的任何信息。您正在使用列表中每个元素的索引来跟踪它(nomes
列表中的第一个值应该写入第一行,依此类推)。
另一方面,仅当代码“正确”时,您才将值附加到nomes
、等。idades
如果代码“错误”,则不会将任何值附加到这些列表,因为关键字continue
结束当前迭代。这是一个问题,因为这些列表应该跟踪代码“错误”的行(即单元格应该保持为空的位置)。
解决方案:
您不应该只是忽略代码“错误”的迭代。无论迭代的代码是对还是错,值都应该附加到相应的列表中。nomes
,idades
依此类推,在非空元素之间应该有空元素,以说明单元格应保持为空的行。
在这种情况下,如果您想为这些行保留空白单元格,则可以在except
块中执行以下操作:(1) 将nome
、idade
等分配给空字符串,以及 (2) 删除continue
关键字以使这些为空字符串被附加到列表nomes
中idades
,等等。
代码示例:
# IF THE CLIENT CODE IS WRONG
except (NoSuchElementException, UnexpectedAlertPresentException):
print('CPF Invalido')
nome = ""
idade = ""
beneficio = ""
# Assign remaining variables to empty string...
推荐阅读
- amazon-web-services - 为生产部署中的每个 aws 服务配置 aws IAM 用户的最佳实践
- java - Java swing 中不播放音频
- qt - 发送数据包时,Interpacket Gap 有多重要?
- c - 使用给定的按位运算符来重现函数
- javascript - 如何在列表中找到最后一个 li 并隐藏一个元素
- operating-system - 在“查看所有窗口”中单击鼠标中键关闭应用程序
- python - 无法为具有形状“(?,1)”的张量“Placeholder_1:0”提供形状(100,)的值
- github - 无法使用 Blend for Visual Studio 2017 在设计器视图中打开 XMAL 文件
- java - 如何在不使用类的情况下调用 Java 类中的方法?
- python - 将 tkinter 标签放在框架内