Skip to content

Instantly share code, notes, and snippets.

@icoz
Created January 10, 2014 19:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save icoz/8360969 to your computer and use it in GitHub Desktop.
Save icoz/8360969 to your computer and use it in GitHub Desktop.
modifications for fav2pdf.py Изменения: 1) содается папка pdf с подпапками posts и hubs 2) при парсинге страницы выдираются и комментарии, потом они сохраняются в топике 3) в posts сохраняются посты по имени id.pdf 4) в hubs создаются подпапки с названиями хабов, которые упоминаются в топиках 5) в тех подпапках хабов создаются символические ссыл…
--- a/fav2pdf.py
+++ b/fav2pdf.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import re
+import os
import sys
from pdf_gen import *
from datetime import date, timedelta, datetime
@@ -11,18 +12,27 @@ import lxml.html
user = 'JazzCore'
site = "habrahabr.ru/users/%s" % user
-from_date = u'' # 5 августа 2009
-to_date = u'' # 30 ноября 2010
-blog_m = [] #[u'Android', u'Mobile Development'] только перечисленные блоги. Должны быть юникодные, не забывать 'u' перед строкой. Звездочки писать не надо.
+from_date = u'' # 5 августа 2009
+to_date = u'' # 30 ноября 2010
+#[u'Android', u'Mobile Development'] только перечисленные блоги. Должны быть юникодные, не забывать 'u' перед строкой. Звездочки писать не надо.
+blog_m = []
topic_per_page = 10
-month = [u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября',
- u'ноября',
- u'декабря']
+month = [
+ u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября',
+ u'ноября',
+ u'декабря']
dr = requests.get('http://' + site + '/favorites/').text
+if not os.path.exists('pdf`'):
+ os.mkdir('pdf')
+if not os.path.exists('pdf/posts'):
+ os.mkdir('pdf/posts')
+if not os.path.exists('pdf/hubs'):
+ os.mkdir('pdf/hubs')
try:
+
doc = lxml.html.document_fromstring(dr)
profilepage = requests.get('http://' + site).text
@@ -31,14 +41,16 @@ try:
count = int(doc.xpath('.//td/a/span/span/text()')[0])
else:
count = int(doc.xpath('.//div/a/span/span/text()')[0])
- # Read-only accounts have different page layout, so it needs different handling
+ # Read-only accounts have different page layout, so it needs different
+ # handling
except:
print 'No favorites found. Most likely its a typo in username'
sys.exit(1)
page = count / topic_per_page + 1
-data_finder = doc.xpath('.//div[@class="posts shortcuts_items"]/div/div[1]/text()')
+data_finder = doc.xpath(
+ './/div[@class="posts shortcuts_items"]/div/div[1]/text()')
if (to_date != ''):
td = to_date.split(' ')
@@ -65,15 +77,16 @@ for p in range(1, page + 1):
print '\nProcessed page %s of %s:' % (p, page)
dr = requests.get('http://%s/favorites/page%s/' % (site, p)).text
- #get posts
+ # get posts
doc = lxml.html.fromstring(dr)
elems = doc.xpath('.//div[@class="posts shortcuts_items"]/div')
- #get hubs from posts
+ # get hubs from posts
hubs = [x.xpath('.//div[@class="hubs"]/a/text()') for x in elems]
postLinks = doc.xpath('.//h1[@class="title"]/a[1]')
- postDates = doc.xpath('.//div[@class="posts shortcuts_items"]/div/div[1]/text()')
+ postDates = doc.xpath(
+ './/div[@class="posts shortcuts_items"]/div/div[1]/text()')
for dd in postDates:
in_date += 1
@@ -85,9 +98,11 @@ for p in range(1, page + 1):
d = date.today()
else:
if re.search('20[0-9]{2}', dd):
- d = date(int(parts[2]), month.index(parts[1]) + 1, int(parts[0]))
+ d = date(int(parts[2]), month.index(
+ parts[1]) + 1, int(parts[0]))
else:
- d = date(datetime.now().year, month.index(parts[1]) + 1, int(parts[0]))
+ d = date(datetime.now().year, month.index(
+ parts[1]) + 1, int(parts[0]))
if from_date_dt <= d <= to_date_dt:
topic_m.append(in_date)
@@ -96,7 +111,7 @@ for p in range(1, page + 1):
for index, a in enumerate(postLinks):
topicCount += 1
- #here we will get /post/ID/ part of the link
+ # here we will get /post/ID/ part of the link
# check for company/link posts
url = a.get('href')
if 'company' in url:
@@ -105,6 +120,9 @@ for p in range(1, page + 1):
token = url.split('linker/')[1].replace('go', 'post')
else:
token = a.get('href').split('ru/')[1]
+ id = token.split('post/')[1]
+ if id[-1] == "/":
+ id = id[:-1]
m_link = u'http://m.habrahabr.ru/%s' % token
@@ -125,25 +143,33 @@ for p in range(1, page + 1):
topic_res = td[t_start:t_stop]
autor = re.findall('<div class="m">\n\t\t\t\n\t\t\t(.*),', topic_res)[0]
topic_res = re.sub('<div class="m">\n\t\t\t\n\t\t\t(.*),',
- '<div class="m"><a href="http://%s.habrahabr.ru">%s</a>,' % (autor, autor), topic_res)
+ '<div class="m"><a href="http://%s.habrahabr.ru">%s</a>,' % (autor, autor), topic_res)
topic_res = re.sub('\s<br/>\s*\S*<br/>', '<br/>', topic_res)
topic_res = topic_res.replace('align="left"/>', '/>')
topic_res = topic_res.replace('align="center"', 'align="middle"')
topic_res = re.sub('/>\s*<img', '/><br/><img', topic_res)
- topic = topic + u'<div><pdf:nextpage /></div><h2><a name="%d">[%s] </a><a href="%s">%s</a></h2><br><br>' % (
- topicCount, u', '.join(hubs[index]), url, a.text) + topic_res
+ cmts_start = td.find('<div class="cmts">')
+ cmts_stop = td.find('<div class="bm">')
+ cmts_res = td[cmts_start:cmts_stop]
+ topic = u'<h2><a name="%d">[%s] </a><br><a href="%s">%s</a></h2><br><br>' % (topicCount, u', '.join(hubs[index]), url, a.text) + topic_res + cmts_res
+ go(topic, 'pdf/posts/' + id + '.pdf')
+ # create symlinks
+ for hub in hubs[index]:
+ if not os.path.exists('pdf/hubs/' + hub):
+ os.mkdir('pdf/hubs/' + hub)
+ os.symlink(
+ '../../posts/' + id + '.pdf', 'pdf/hubs/' + hub +"/" + id + '.pdf')
except:
print ' Topic: %s->%s is locked!' % (', '.join(hubs[index]), a.text)
print '----------------------'
-content += topic
-
+ # content += topic
#f = open('1.html', 'w')
-#f.write(topic)
-#f.close()
+# f.write(topic)
+# f.close()
-go(content, user + '.pdf')
+# go(content, user + '.pdf')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment