有啥问题吗? [关闭]
Posted
技术标签:
【中文标题】有啥问题吗? [关闭]【英文标题】:Is there anything wrong? [closed]有什么问题吗? [关闭] 【发布时间】:2021-04-07 00:38:47 【问题描述】:我正在学习 python Selenium,并创建了一个“电子邮件”列表:“密码”。我需要在正确的位置插入这些电子邮件,然后是密码,然后是登录按钮。这是代码:
f = open('users.txt','r')
for line in f.readlines():
print(line)
mail = line[0:line.index(':')]
line = line[line.index(':')+1:]
password = line
email_input = driver.find_element_by_xpath('//*[@id="email"]')
email_input.click()
email_input.send_keys(mail)
password_input = driver.find_element_by_xpath('//*[@id="password"]')
password_input.click()
password_input.send_keys(password)
lgn_btn = driver.find_element_by_css_selector('#sign-in')
lgn_btn.click()
n_url = driver.current_url
time.sleep(5)
driver.refresh()
我得到的错误是:
mail = line[0:line.index(':')] ValueError: 未找到子字符串
txt文件是:
g_santeusanio@arcor.de:sportpark13
mrtslabbert@absamail.co.za:oohethooq12313w
lauriecd@absamail.co.za:christcorem
【问题讨论】:
请提供minimal reproducible example并阅读***.com/help/how-to-ask 如果没有任何问题,你会发布这个吗?这不是一个足够的帖子标题。您认为它会满足哪种类型的搜索参数? 文本文件在电子邮件地址之间是否有空行,如您在此处显示的那样? 【参考方案1】:你应该使用
line.find(':')
而不是line.index(':')
这是因为,index() 方法在 中搜索子字符串并返回它的索引。
由于要在字符串中查找单个字符,所以应该使用find()
方法!
两个代码都使用的文本文件,演示:
根据@John Gordon 的评论进行编辑
当字符串中不存在这样的值时,index()
方法会返回 值错误。使用的文本文件有 2 个空行。 find()
方法返回 -1 而不是错误。
请注意,问题中使用的代码块打印了第一对邮件和密码
当它在第二行(为空)中搜索值时,它会引发ValueError
。另一方面,如果您在使用find()
方法时看到输出(下面附上的img),它只会打印出空字符串并继续前进!
因此,当您不确定要搜索的值是否在字符串中时,最好使用find()
。
基于来自@Chris 的 cmets 进行的编辑
这是我使用的代码:
for line in f.readlines():
# print(line)
mail = line[0:line.find(':')]
password = line[line.find(':') + 1:]
print(mail)
print(password)
我收到的您粘贴的文本的输出是这样的:
【讨论】:
代码块需要缩进或三个反引号,而不是两个。我已从您的代码块中删除了一些无关的反引号。 Please don't post screenshots of text。它们无法被搜索或复制,并且可用性差。相反,将代码作为文本直接粘贴到您的问题中。如果选择它并单击
按钮或Ctrl+K,则代码块将缩进四个空格,这将导致其呈现为代码。
字符串同时具有.index()
和.find()
方法,除了找不到目标字符串时的行为外,它们是相同的。我看不出这个答案如何解决真正的问题,即在该行中找不到:
。
好吧,问题不在于函数,而是当字符串中不存在此类值或字符串为空时(如本例)find()
返回 -1
和 @ 987654343@ 返回ValueError
!正如我所说,在搜索单个字符时,使用find()
方法总是比使用index()
更好,这就是我的意见。我应该提到退货,现在将对其进行编辑。谢谢提醒。【参考方案2】:
我认为在这种情况下split()
更容易理解和使用。 split()
按提供的字符拆分字符串并返回包含结果的值数组。在这种情况下,我们可以通过“:”进行拆分,得到两部分。
所以前几行变成了
for line in f.readlines():
print(line)
data = line.split(':')
mail = data[0]
password = data[1]
...
这应该可以解决您询问的问题,但查看您的其余代码,还会出现其他问题,我有一些建议。
不要覆盖变量。
line = line[line.index(':')+1:]
它使您的代码更难遵循,例如你在这里用另一个值覆盖了line
。现在您无法再访问 line
的原始值,并且随着脚本变得越来越长,其他读者(包括您自己)将难以调试代码。而是给它一个新名称,以最好地代表变量将包含的内容。在本例中为 password
,就像您在下一行所做的那样。
line = line[line.index(':')+1:]
password = line
变成
password = line[line.index(':')+1:]
使用最简单的定位器形式,例如如果您通过 ID 定位元素,则使用 .find_element_by_id()
,而不是 XPath 或 CSS 选择器。这将使您的代码更易于阅读。
email_input = driver.find_element_by_xpath('//*[@id="email"]')
变成
email_input = driver.find_element_by_id('email')
您正在单击,然后将元素的键发送到同一元素。通常,这不是必需的,您可以省略单击。 (在某些情况下这是必要的,但根据我的经验,这种情况相当罕见)。
email_input = driver.find_element_by_id('email')
email_input.click()
email_input.send_keys(mail)
变成
email_input = driver.find_element_by_id('email')
email_input.send_keys(mail)
甚至
driver.find_element_by_id('email').send_keys(mail)
因为您之后似乎不再使用email_input
。
所以用上面的建议更新代码,它看起来像这样
for line in f.readlines():
print(line)
data = line.split(":")
email = data[0]
password = data[1]
driver.find_element_by_id('email').send_keys(email)
driver.find_element_by_id('password').send_keys(password)
driver.find_element_by_id('sign-in').click()
n_url = driver.current_url
time.sleep(5)
driver.refresh()
【讨论】:
以上是关于有啥问题吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章