curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | perl -ne 'print "\t" if /<name>/; print "$2\n" if /<(title|name)>(.*)<\/\1>/;'
我有这个 shell 脚本,它使用用户名和密码的命令行参数获取 Atom 提要。我想知道这种类型的事情在 Python 中是否可行,如果可行,我将如何着手去做。原子提要只是普通的 XML。
最佳答案
Python 并不像 Perl 那样适合紧凑的一行代码。这主要出于三个原因:
- 在 Perl 中,空格几乎在所有情况下都是无关紧要的。在 Python 中,空格非常重要。
- Perl 有一些有用的快捷方式,例如
perl -ne
或perl -pe
可以放置一个 implicit loop围绕代码行。 - 有一个large body a cargo-cult Perl 一个行来做有用的事情。
总而言之,这个 python 与您在 Perl 中发布的内容很接近:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | python -c '
import sys
for s in sys.stdin:
s=s.strip()
if not s: print '\t',
else: print s
'
要做得更好有点困难,因为正如我的评论中所述,您发布的 Perl 不完整。你有:
perl -ne 'print "\t" if //; print "$2\n" if /(.*)/;'
相当于:
LINE:
while (<>) {
print "\t" if //; # print a tab for a blank line
print "$2\n" if /(.*)/; # nonsensical. Print second group but only
# a single match group defined...
}
编辑
虽然用 Python 重写 Perl 很简单,但这里有一些更好的东西:
#!/usr/bin/python
from xml.dom.minidom import parseString
import sys
def get_XML_doc_stdin(f):
return xml.dom.minidom.parse(f)
def get_tagged_data2(tag, index=0):
xmlData = dom.getElementsByTagName(tag)[index].firstChild.data
return xmlData
data=sys.stdin.read()
dom = parseString(data)
ele2=get_tagged_data2('title')
print ele2
count=int(get_tagged_data2('fullcount'))
print count,"New Messages:"
for i in range(0,count):
nam=get_tagged_data2('name',i)
email=get_tagged_data2('email',i)
print " {0}: {1} <{2}>".format(i+1,nam,email)
现在将其保存在文本文件中,对其运行 chmod +x
,然后:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" |
/path/pythonfile.py
它产生这个:
Gmail - Inbox for xxxxxxx@gmail.com
2 New Messages:
1: bob smith <bob@smith.com>
2: Google Alerts <googlealerts-noreply@google.com>
编辑2 如果您不喜欢,这里是 Python 1 行过滤器:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" |python -c '
import sys, re
for t,m in re.findall(r"<(title|name)>(.*)<\/\1>",sys.stdin.read()):
print "\t",m
'
关于python - 这个 Perl XML 过滤器在 Python 中是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709312/