在下面的代码中,我无法在操作(更新,黑名单,自动)之后添加-v和-p参数,可能是由于subparser。我怎样才能使它能以任何顺序添加这些可选参数?
var url = "https://fotogaleri.haberler.com/unlu-sarkici-imaj-degistirdi-gorenler-gozlerine/";
//I will get the images src values in .col-big div at this url.
var web = new HtmlWeb();
var doc = web.Load(url);
var htmlNodes = doc.DocumentNode.SelectNodes("//div[@class='col-big']//*/img");
//i am selecting all images in div.col-big. But there is nothing.
foreach (var node in htmlNodes)
{
Console.WriteLine(node.Attributes["src"].Value);
}
根据解析器,这是有效的:
parser = argparse.ArgumentParser(usage='pyfilter.py <file> <action> <options>')
parser.add_argument('file', help='blacklist file containing IPs', type=str)
subparsers = parser.add_subparsers(help='help', dest='action')
parser_update = subparsers.add_parser('update', help='update help')
parser_blacklist = subparsers.add_parser('blacklist', help='blacklist help')
parser_auto = subparsers.add_parser('auto', help='auto help')
parser_auto.add_argument('-i', '--interval', help='interval help')
parser.add_argument('-p', '--port', help='specify the port to block', type=int)
parser.add_argument('-v', '--verbose', help='write output to screen', nargs='?')
args = parser.parse_args()
然而,这会在更新&#39;
之后的每个参数产生错误python3.5 testfilter.py /etc/blacklist.lst -p 22 -v yes update
答案 0 :(得分:0)
这就是你的解析器树的样子
parser
|__ update
| |__ updateOpts
|__ blacklist
|__ auto
|__ port
|__ verbose
所以如果你做了更新,它将遍历updateOpts,它找不到端口或详细信息
答案 1 :(得分:0)
主解析器会识别file
(必填),--port
和--verbose
,以及子分析器选择{'update','auto'}
。
一旦遇到subparser参数,它就会将解析委托给该解析器。子解析器完成后,主解析器不会恢复解析。它报告subparser无法处理的字符串为无法识别。
因此,在调用subparser之前,所有用于主解析器的字符串都必须发生。
您可以使用parse_known_args
解决此问题。然后,无法识别的args将在extras
列表中返回,这可以通过另一个解析步骤来处理。
Add top level argparse arguments after subparser args
How do you get argparse to choose a default subparser?
通常argparse
尝试以任何顺序允许选项(标记)参数。当存在变量narg
位置时,存在一些限制,在这种情况下,存在子分析符。一旦您了解了代码的组织方式,这种行为就有意义了。