编写代码以支持多个参数,但是仅给出一个参数时会失败。 sys.argv [1] + sys.argv [2]

时间:2019-01-01 19:44:56

标签: python web-scraping translators

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

我正在编写一个程序,该程序通过从字典.com中提取信息来定义单词。我正在密切关注视频教程,因为我只是在尝试学习如何使基本字典正常工作(长期目标是编写独立于Google翻译api或类似工具的翻译应用)。我有一个有效的代码,当您输入单词时,它会提取定义,但是当您输入两个单词时,它会提取定义,下面是示例。因此,我添加了一个参数,该参数适用于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 个答案:

答案 0 :(得分:4)

切片:

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

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]

阅读:

答案 1 :(得分:3)

这是切片的好用例。您需要列表中第一个参数之后的所有内容,因此将其切成一片[1:]。因此,只需使用:

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

例如:

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