nevernote/nevernote.py

101 lines
2.7 KiB
Python
Raw Normal View History

2013-11-09 17:20:53 +00:00
#!/usr/bin/python3
import argparse
2013-11-09 18:01:43 +00:00
import http.client
2014-06-01 19:20:42 +00:00
import html.parser
2013-11-09 17:20:53 +00:00
import sys
2013-11-09 18:01:43 +00:00
from urllib.parse import urlparse
2014-06-17 18:31:02 +00:00
import zlib
2013-11-09 17:20:53 +00:00
2014-06-01 19:20:42 +00:00
class TitleParser(html.parser.HTMLParser):
2014-06-21 05:58:47 +00:00
def handle_starttag(self, name, attribs):
if name == 'title':
title_start = self.rawdata.index('<title>') + len('<title>')
title_end = self.rawdata.index('</title>', title_start)
self.title = self.rawdata[title_start:title_end]
2014-06-01 19:20:42 +00:00
def download_content(url):
2013-11-09 17:20:53 +00:00
'''download page and decode it to utf-8'''
2013-11-09 18:01:43 +00:00
up = urlparse(url)
if not up.scheme:
2014-06-17 18:28:54 +00:00
up = urlparse('//' + url)
2013-11-09 18:01:43 +00:00
headers = {
"Host": up.netloc,
"Content-Type": "text/html; charset=utf-8",
"Connection": "keep-alive",
}
2014-06-21 05:43:12 +00:00
if up.scheme == 'http':
2013-11-09 18:01:43 +00:00
conn = http.client.HTTPConnection(up.netloc)
elif up.scheme == 'https':
conn = http.client.HTTPSConnection(up.netloc)
else:
raise NotImplementedError("protocol %s is not implemented" % up.scheme)
2013-11-09 18:01:43 +00:00
conn.request("GET", up.path, None, headers)
response = conn.getresponse()
2013-12-24 19:00:43 +00:00
# follow redirects
2014-06-17 18:28:54 +00:00
if ((response.status == http.client.MOVED_PERMANENTLY)
or (response.status == http.client.FOUND)):
2013-11-09 20:15:30 +00:00
new_url = response.getheader('Location')
2014-06-21 05:43:12 +00:00
print('Redirecting to ' + new_url)
return download_content(new_url)
return response
def get_page(url):
response = download_content(url)
2013-11-09 18:01:43 +00:00
# get page charset from response header
c_type = response.getheader('Content-Type')
if not c_type.startswith('text'):
raise ValueError('incorrect Content-Type for HTML page: %s' % c_type)
2014-06-17 18:31:02 +00:00
c_encoding = response.getheader('Content-Encoding')
if c_encoding:
if c_encoding == 'gzip':
page_binary = zlib.decompress(response.read(), 16+zlib.MAX_WBITS)
else:
raise NotImplementedError(
'content encoding %s is not implemented' % c_encoding)
else:
page_binary = response.read()
charset = 'iso-8859-1'
ct_spl = c_type.split('; ')
if len(ct_spl) > 1:
charset = ct_spl[1].split('=')[1]
2013-11-09 18:01:43 +00:00
page = page_binary.decode(charset)
return page
2013-11-09 17:20:53 +00:00
def write_file(page):
2014-06-01 19:20:42 +00:00
parser = TitleParser(strict=False)
parser.feed(page)
fname = parser.title + '.html'
2013-12-24 19:00:43 +00:00
with open(fname, 'w') as a_file:
2013-11-09 17:20:53 +00:00
a_file.write(page)
def main():
2014-06-17 18:28:54 +00:00
parser = argparse.ArgumentParser(
description='Nevernote - download pages locally.')
parser.add_argument('urls', metavar='URL', type=str, nargs='+',
help='URL of page to download')
2013-11-09 17:20:53 +00:00
args = parser.parse_args()
for url in args.urls:
page = get_page(url)
write_file(page)
if __name__ == '__main__':
sys.exit(main())