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。
答案 0 :(得分:3)
Python不像Perl一样压缩一个衬里。这主要有三个原因:
perl -ne
或perl -pe
在代码行周围加implicit loop。 所有人都说,这个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
'
答案 1 :(得分:1)
您可以使用urllib2
标准Python模块中的“URL开启者”和一个用于身份验证的处理程序。例如:
#!/usr/bin/env python
import getpass
import sys
import urllib2
def main(program, username=None, password=None, url=None):
# Get input if any argument is missing
username = username or raw_input('Username: ')
password = password or getpass.getpass('Password: ')
url = url or 'https://mail.google.com/mail/feed/atom'
# Create password manager
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, url, username, password)
# Create HTTP Authentication handler and URL opener
authhandler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(authhandler)
# Fetch URL and print content
response = opener.open(url)
print response.read()
if __name__ == '__main__':
main(*sys.argv)
如果您还要从Feed中提取信息,则应检查如何使用feedparser
解析Password-Protected Feeds。