nevernote/nevernote.py

79 lines
1.9 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
2013-11-09 17:20:53 +00:00
import sys
2013-12-24 19:00:43 +00:00
from bs4 import BeautifulSoup
2013-11-09 18:01:43 +00:00
from urllib.parse import urlparse
2013-11-09 17:20:53 +00:00
def get_page(url):
'''download page and decode it to utf-8'''
2013-11-09 18:01:43 +00:00
charset = 'utf-8'
up = urlparse(url)
headers = {
"Host": up.netloc,
"Content-Type": "text/html; charset=utf-8",
"Connection": "keep-alive",
}
if up.scheme == 'http':
conn = http.client.HTTPConnection(up.netloc)
elif up.scheme == 'https':
conn = http.client.HTTPSConnection(up.netloc)
else:
print("ERROR: invalid protocol set in '{0}'".format(url))
return False
conn.request("GET", up.path, None, headers)
response = conn.getresponse()
2013-12-24 19:00:43 +00:00
# follow redirects
2013-11-09 20:15:30 +00:00
if (response.status == http.client.MOVED_PERMANENTLY) \
or (response.status == http.client.FOUND):
new_url = response.getheader('Location')
print('Redirect to ' + new_url)
return get_page(new_url)
2013-11-09 18:01:43 +00:00
# get page charset from response header
2013-11-09 18:01:43 +00:00
contenttype = response.getheader('Content-Type')
if contenttype:
ct_spl = contenttype.split('; ')
if len(ct_spl) > 1:
charset = ct_spl[1].split('=')[1]
2013-11-09 18:01:43 +00:00
page_binary = response.read()
page = page_binary.decode(charset)
return page
2013-11-09 17:20:53 +00:00
2013-12-24 19:00:43 +00:00
def get_title(page):
soup = BeautifulSoup(page)
return soup.title.string
2013-11-09 17:20:53 +00:00
def write_file(page):
2013-12-24 19:00:43 +00:00
fname = get_title(page) + '.html'
with open(fname, 'w') as a_file:
2013-11-09 17:20:53 +00:00
a_file.write(page)
def main():
parser = argparse.ArgumentParser(description=
'Nevernote - download pages locally.')
parser.add_argument('urls', metavar='URL', type=str, nargs='+', help=
'URL of page to download')
args = parser.parse_args()
for url in args.urls:
page = get_page(url)
write_file(page)
if __name__ == '__main__':
sys.exit(main())