这个Perl XML过滤器在Python中是什么样的?

时间:2011-01-17 01:32:53

标签: python regex perl email curl

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。

2 个答案:

答案 0 :(得分:3)

Python不像Perl一样压缩一个衬里。这主要有三个原因:

  1. 使用Perl,几乎在所有情况下,空白都是微不足道的。在Python中,空白非常重要。
  2. Perl为一个内容提供了一些有用的快捷方式,例如perl -neperl -pe在代码行周围加implicit loop
  3. 有一个large body a cargo-cult Perl一个衬里​​来做有用的事情。
  4. 所有人都说,这个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