【问题标题】:Code is written to support multiple arguments, but fails when only one argument is given. sys.argv[1] + sys.argv[2]编写代码以支持多个参数,但在仅给出一个参数时失败。 sys.argv[1] + sys.argv[2]
【发布时间】:2019-05-28 15:13:21
【问题描述】:

我当前的代码使用变量“word”,所以 word = sys.argv[1] + sys.argv[2],当我有两个参数时效果很好,但是当我只有一个参数时,我得到 IndexError : 列表索引超出范围

我正在编写一个程序,它通过从字典 .com 中提取信息来定义单词。我正在密切关注视频教程,因为我只是想学习如何让基本词典工作,(长期目标是编写一个独立于谷歌翻译 api 或类似内容的翻译应用程序)。我有一个代码,它可以在您输入单词时提取定义,但在您输入 2 个单词时不会,示例如下。所以我添加了一个参数,它适用于 2 个单词,但不再适用于一个单词。

import requests
from bs4 import BeautifulSoup as bs
import sys

url = "https://www.dictionary.com/browse/"

word = sys.argv[1] + sys.argv[2]

url+= word
r = requests.get(url)
soup = bs(r.content, "lxml")


try:
    pos = soup.findAll("span", {"class" : "luna-pos"})[0].text #luna-pos is an html tag
    definitions = soup.findAll("ol")
    meanings = definitions[0].findChildren("li", recursive=False)
    print(word + ": " + pos)
    for (i,meaning) in enumerate(meanings):
        print(str(i + 1), meaning.text)
except:
     print("Word not found")

预期结果: 打印单词、词性和定义。 即定义单词(作为单个参数)“正确” 还要定义“自我控制”(两个词参数)

【问题讨论】:

  • 在尝试访问不存在的 [2] 索引之前检查您有多少个参数?基本if 条件。
  • @ParitoshSingh 并不是最好的解决方案。那么 3 个参数会发生什么? 4? 100?
  • 是的,没错。

标签: python web-scraping translators


【解决方案1】:

切片:

您可以使用列表切片来避免错误:

word = ''.join(sys.argv[1:]  # joins 1st to last ..

word = ''.join(sys.argv[1:3]  # 1st and 2nd without error 

即使切片索引大于列表中元素的数量,列表切片仍然有效。


测试:

处理它的另一种方法是先测试然后附加:

if len(sys.argv) == 2:
    word = sys.argv[1]
elif len(sys.argv) >= 3:
    word = sys.argv[1]+sys.argv[2]
else:
    word = "" # no input given

错误处理

如果发生错误,请尝试并处理(请参阅下面的请求宽恕而不是许可

try:
    word = sys.argv[1]+sys.argv[2]
except IndexError:
    word = sys.argv[1]

阅读:

【讨论】:

    【解决方案2】:

    这是一个很好的切片用例。您想要列表中第一个参数之后的所有内容,因此作为切片,它转换为[1:]。所以只需使用:

    word = ''.join(sys.argv[1:])
    

    例如:

    >>> args = ['scriptname.py', 'the']
    >>> ''.join(args[1:])
    'the'
    >>> args = ['scriptname.py', 'self', 'control']
    >>> ''.join(args[1:])
    'selfcontrol'
    

    【讨论】:

    • @JadonMurphy 如果它解决了您的问题,请考虑接受答案。
    • @bitto 我只是说我必须等几分钟。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2017-12-29
    • 2014-12-08
    相关资源
    最近更新 更多