我正在尝试使用jython编译一个python程序,它正在抛出错误
C:\jython2.2.1>jython test.py
Traceback (innermost last):
(no code object) at line 0
File "test.py", line 30
html = html if html else download(url, user_agent).read()
^
SyntaxError: invalid syntax
下面是我的python程序。请让我知道如何解决这个问题。
import sys
import re
import urllib2
import urlparse
from optparse import OptionParser
# regular expression data for each website
VIDEO_DATA = [
('youtube.com', '%7C(.*?videoplayback.*?)%2C'),
('metacafe.com', '&mediaURL=(.*?)&'),
]
# default user agent to use when downloading
USER_AGENT = 'pytube'
# size of file to download
CHUNK_SIZE = 1024 * 1024
def scrape(url, html=None, user_agent=None, output=None):
"""Scrape video location from given url.
Use html instead of downloading if passed.
Download file to output if passed.
Return url of video if found, else None
"""
netloc = urlparse.urlsplit(url).netloc
for domain, video_re in VIDEO_DATA:
if domain in netloc:
html = html if html else download(url, user_agent).read()
search = re.search(video_re, html)
if search:
flash_url = urllib2.unquote(search.group(1))
if output:
print "Downloading flash to `%s'" % output,
#open(output, 'wb').write(download(flash_url, user_agent).read())
req = download(flash_url, user_agent)
# testing with keyword in python
with open(output, 'wb') as fp:
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
print
return flash_url
else:
raise PyTubeException('Failed to locate video regular expression in downloaded HTML')
raise PyTubeException('URL did not match available domains')
def download(url, user_agent=None):
"""Download url and return data
"""
headers = {'User-Agent' : user_agent}
req = urllib2.Request(url, None, headers)
return urllib2.urlopen(req)
class PyTubeException(Exception):
pass
if __name__ == '__main__':
# parse command line options
parser = OptionParser(usage='usage: %prog, [-o <file.flv> -a <user_agent> -s -h] url')
parser.add_option('-o', '--output', dest='output', help='Output file to download flash file to. If this is not specified file will not be downloaded.')
parser.add_option('-s', '--sites', action='store_true', default=False, dest='sites', help='Display sites that pytube supports, then quit.')
parser.add_option('-a', '--agent', dest='user_agent', default=USER_AGENT, help='Set user-agent for downloads.')
options, args = parser.parse_args()
if options.sites:
print '\n'.join(domain for (domain, reg) in VIDEO_DATA)
else:
if args:
flash_url = scrape(args[0], user_agent=options.user_agent, output=options.output)
if flash_url:
print flash_url
else:
print 'Need to pass the url of the video you want to download'
parser.print_help()
答案 0 :(得分:1)
就语法而言,Jython 2.2.1(AFAIK)等同于Cpython 2.2.1。导致问题的行使用稍后介绍的三元运算符。解决方案是用if语句替换它。
if not html:
html = download(url, user_agent).read()
那应该处理语法错误。还有一个with
子句需要替换。
with open(output, 'wb') as fp:
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
您可以将其替换为
try:
fp = open(output, 'w')
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
finally:
fp.close()