有啥问题吗? [关闭]

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

【讨论】:

以上是关于有啥问题吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询 - 这有啥问题吗? [关闭]

在异地托管图像有啥害处吗? [关闭]

有啥高调的开源金融项目吗? [关闭]

WebSVN 有啥好的替代品吗? [关闭]

未关闭的客户端会话。有啥解决办法吗?

有啥好的关系数据库教程吗? [关闭]