Teraz jest 28 mar 2024 18:18:47




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Calibre i Wprost na Kindle - rozwiązanie! 
Autor Wiadomość
Użytkownik

Dołączył(a): 03 maja 2011 16:20:28
Posty: 8
eCzytnik: Kindle
Post Calibre i Wprost na Kindle - rozwiązanie!
Ponieważ nie mogłem się doczekać rozwiązania ze stronicowaniem Wprost na Kindle ściaganym przez Calibre, więc usiadłem, podłubałem i... zrobiłem. Problem polegał na tym, że cały artykuł jest konwertowany jako jedna wielka tabela. Kindle nie radzi sobie z wyświetlaniem komórki większej niż ekran.
Najprostsze rozwiązanie: w pliku wprost.recipe dodać kod usuwający tagi table,tr,td , a później zapisac go jako własne źródło danych.
Kod:
        preprocess_regexps = [(re.compile(r'style="display: none;"'), lambda match: ''),
        (re.compile(r'display: block;'), lambda match: ''),
        (re.compile(r'\<td\>\<tr\>\<\/table\>'), lambda match: ''),
        (re.compile(r'\<table .*?\>'), lambda match: ''),
        (re.compile(r'\<tr>'), lambda match: ''),
        (re.compile(r'\<td .*?\>'), lambda match: '')]


Poprawiony plik recipe można ściągnąć stąd:
http://hotfile.com/dl/116646829/004a6a5 ... ecipe.html
żeby dodać: zapisujemy plik na dysku, z menu wybieramy "Pobierz newsy" -> "Dodaj własne źródło newsów". klikamy "Wczytaj źródło z pliku"
Przy pytaniu o nadpisanie istniejącego należy potwierdzić.
Nowe Wprost będzie widoczne w drzewie wyboru pod hasłem "Dostosuj"
Miłego czytania!


03 maja 2011 18:21:31
Zobacz profil
SwiatCzytnikow.pl
Avatar użytkownika

Dołączył(a): 14 sie 2010 11:00:21
Posty: 1873
eCzytnik: kindle, onyx, nook, kobo, pb, ipad
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Super, że Ci się udało. A możesz całą receptę wkleić po prostu w treści?

Nie mogę się przebić przez captchę w hotfile (mówi mi że błędny kod), a serwis rapideo, którego używam do takich linków twierdzi, że jest problem z plikiem.

_________________
http://swiatczytnikow.pl (dawniej: Świat Kindle)
http://ebooki.swiatczytnikow.pl - (prawie) wszystkie polskie e-booki w jednym miejscu, czyli porównywarka ofert księgarni.


03 maja 2011 19:37:11
Zobacz profil WWW
Użytkownik

Dołączył(a): 19 sty 2011 2:10:52
Posty: 11
eCzytnik: Kindle 3
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Super robota!


03 maja 2011 19:37:18
Zobacz profil
Użytkownik

Dołączył(a): 03 maja 2011 16:20:28
Posty: 8
eCzytnik: Kindle
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Vroo napisał(a):
Super, że Ci się udało. A możesz całą receptę wkleić po prostu w treści?

Nie mogę się przebić przez captchę w hotfile (mówi mi że błędny kod), a serwis rapideo, którego używam do takich linków twierdzi, że jest problem z plikiem.

W zasadzie mogę ale jak sie coś przy przeklejaniu sknoci to bedzie problem. Dlatego lepiej pobrac plik
Jesli jednak chcesz:
Kod:
#!/usr/bin/env  python

__license__   = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com'
__copyright__ = 'Modified 2011,  Mariusz Wolek <mariusz_dot_wolek @ gmail dot com>'

from calibre.web.feeds.news import BasicNewsRecipe
import re

class Wprost(BasicNewsRecipe):
        EDITION = 0
        FIND_LAST_FULL_ISSUE = True
        EXCLUDE_LOCKED = True
        ICO_BLOCKED = 'http://www.wprost.pl/G/icons/ico_blocked.gif'

        title = u'Wprost'
        __author__ = 'matek09'
        description = 'Weekly magazine'
        encoding = 'ISO-8859-2'
        no_stylesheets = True
        language = 'pl'
        remove_javascript = True

        remove_tags_before = dict(dict(name = 'div', attrs = {'id' : 'print-layer'}))
        remove_tags_after = dict(dict(name = 'div', attrs = {'id' : 'print-layer'}))

        '''keep_only_tags =[]
        keep_only_tags.append(dict(name = 'table', attrs = {'id' : 'title-table'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-header'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-content'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'def element-autor'}))'''

        preprocess_regexps = [(re.compile(r'style="display: none;"'), lambda match: ''),
        (re.compile(r'display: block;'), lambda match: ''),
        (re.compile(r'\<td\>\<tr\>\<\/table\>'), lambda match: ''),
        (re.compile(r'\<table .*?\>'), lambda match: ''),
        (re.compile(r'\<tr>'), lambda match: ''),
        (re.compile(r'\<td .*?\>'), lambda match: '')]

        remove_tags =[]
        remove_tags.append(dict(name = 'div', attrs = {'class' : 'def element-date'}))
        remove_tags.append(dict(name = 'div', attrs = {'class' : 'def silver'}))
        remove_tags.append(dict(name = 'div', attrs = {'id' : 'content-main-column-right'}))

        extra_css = '''
                                        .div-header {font-size: x-small; font-weight: bold}
                                        '''
#h2 {font-size: x-large; font-weight: bold}
        def is_blocked(self, a):
                if a.findNextSibling('img') is None:
                        return False
                else:
                        return True



        def find_last_issue(self):
                soup = self.index_to_soup('http://www.wprost.pl/archiwum/')
                a = 0
                if self.FIND_LAST_FULL_ISSUE:
                        ico_blocked = soup.findAll('img', attrs={'src' : self.ICO_BLOCKED})
                        a = ico_blocked[-1].findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                else:
                        a = soup.find('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                self.EDITION = a['href'].replace('/tygodnik/?I=', '')
                self.cover_url = a.img['src']



        def parse_index(self):
                self.find_last_issue()
                soup = self.index_to_soup('http://www.wprost.pl/tygodnik/?I=' + self.EDITION)
                feeds = []
                for main_block in soup.findAll(attrs={'class':'main-block-s3 s3-head head-red3'}):
                        articles = list(self.find_articles(main_block))
                        if len(articles) > 0:
                                section = self.tag_to_string(main_block)
                                feeds.append((section, articles))
                return feeds

        def find_articles(self, main_block):
                for a in main_block.findAllNext( attrs={'style':['','padding-top: 15px;']}):
                        if a.name in "td":
                                break
                        if self.EXCLUDE_LOCKED & self.is_blocked(a):
                                continue
                        yield {
                                'title' : self.tag_to_string(a),
                                'url'   : 'http://www.wprost.pl' + a['href'],
                                'date'  : '',
                                'description' : ''
                                }



Ostatnio edytowano 04 maja 2011 3:40:06 przez zaslav, łącznie edytowano 2 razy



03 maja 2011 19:51:11
Zobacz profil
SwiatCzytnikow.pl
Avatar użytkownika

Dołączył(a): 14 sie 2010 11:00:21
Posty: 1873
eCzytnik: kindle, onyx, nook, kobo, pb, ipad
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Jakbym mógł pobrać, to bym nie prosił o wklejenie. Wszystko ładnie działa. :)

_________________
http://swiatczytnikow.pl (dawniej: Świat Kindle)
http://ebooki.swiatczytnikow.pl - (prawie) wszystkie polskie e-booki w jednym miejscu, czyli porównywarka ofert księgarni.


03 maja 2011 20:36:05
Zobacz profil WWW
Użytkownik

Dołączył(a): 19 paź 2010 21:00:49
Posty: 18
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Dzięki, działa super. A czy jest jakiś sposób, żeby te ostatnie numery, z których ściągał tylko pierwsze strony artykułów, jeszcze raz dociągnąć w całości? Tzn. czy można ściągnąć tylko ostatni numer, czy wcześniejsze z archiwum także?


03 maja 2011 20:41:41
Zobacz profil
Użytkownik

Dołączył(a): 03 maja 2011 16:20:28
Posty: 8
eCzytnik: Kindle
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
receptura dla Wprost - pozwala pobrać dowolny udostępniony numer archiwalny z 2011 roku . Tytuł jest odpowiednio ustawiany. Proponuję zapiąć, uruchomić pobieranie i wszystko stanie sie jasne :)
lista dostępnych numerów: http://www.wprost.pl/archiwum - to te, które nie mają ikonki 'SMS/Karta' :)
Uwaga - to jest wersja interaktywna i nie należy jej używać do normalnego, cyklicznego pobierania!

Kod:
#!/usr/bin/env  python

__license__   = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com'
__copyright__ = 'Modified 2011,  Mariusz Wolek <mariusz_dot_wolek at gmail dot com>'

from calibre.web.feeds.news import BasicNewsRecipe
import re
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class Wprost(BasicNewsRecipe):
        EDITION = 0
        FIND_LAST_FULL_ISSUE = True
        EXCLUDE_LOCKED = True
        ICO_BLOCKED = 'http://www.wprost.pl/G/icons/ico_blocked.gif'

        title = u'Wprost'
        __author__ = 'matek09'
        description = 'Weekly magazine'
        encoding = 'ISO-8859-2'
        no_stylesheets = True
        language = 'pl'
        remove_javascript = True

        remove_tags_before = dict(dict(name = 'div', attrs = {'id' : 'print-layer'}))
        remove_tags_after = dict(dict(name = 'div', attrs = {'id' : 'print-layer'}))

        '''keep_only_tags =[]
        keep_only_tags.append(dict(name = 'table', attrs = {'id' : 'title-table'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-header'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-content'}))
        keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'def element-autor'}))'''

        preprocess_regexps = [(re.compile(r'style="display: none;"'), lambda match: ''),
        (re.compile(r'display: block;'), lambda match: ''),
        (re.compile(r'\<td\>\<tr\>\<\/table\>'), lambda match: ''),
        (re.compile(r'\<table .*?\>'), lambda match: ''),
        (re.compile(r'\<tr>'), lambda match: ''),
        (re.compile(r'\<td .*?\>'), lambda match: '')]

        remove_tags =[]
        remove_tags.append(dict(name = 'div', attrs = {'class' : 'def element-date'}))
        remove_tags.append(dict(name = 'div', attrs = {'class' : 'def silver'}))
        remove_tags.append(dict(name = 'div', attrs = {'id' : 'content-main-column-right'}))

        extra_css = '''
                                        .div-header {font-size: x-small; font-weight: bold}
                                        '''
#h2 {font-size: x-large; font-weight: bold}
        def is_blocked(self, a):
                if a.findNextSibling('img') is None:
                        return False
                else:
                        return True



        def find_last_issue(self):
                soup = self.index_to_soup('http://www.wprost.pl/archiwum/')
                a = 0
                app = QtGui.QApplication(sys.argv)
                widget = QtGui.QWidget()
                numer_get, ok=QtGui.QInputDialog.getInteger(widget, 'Ktory numer z archiwum?', 'Numer z archiwum: 1-ostatni, 2-przedostatni etc',1,min=1,max=52)

                #take value if ok was pressed otherwise use default value
                if ok:
                  numer=numer_get
                  self.title = self.title + ' archiwum ' + str(numer)
                else:
                  numer=1


                pages = range(1, numer)
                if self.FIND_LAST_FULL_ISSUE:
                        ico_blocked = soup.findAll('img', attrs={'src' : self.ICO_BLOCKED})
                        a = ico_blocked[-1].findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                        for page in pages:
                                a = a.findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                else:
                        a = soup.find('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                if numer > 1:
                        pref,data=a.img['alt'].split('numeru')
                        self.title =  u'WPROST - numer'+data
                self.EDITION = a['href'].replace('/tygodnik/?I=', '')
                self.cover_url = a.img['src']



        def parse_index(self):
                self.find_last_issue()
                soup = self.index_to_soup('http://www.wprost.pl/tygodnik/?I=' + self.EDITION)
                feeds = []
                for main_block in soup.findAll(attrs={'class':'main-block-s3 s3-head head-red3'}):
                        articles = list(self.find_articles(main_block))
                        if len(articles) > 0:
                                section = self.tag_to_string(main_block)
                                feeds.append((section, articles))
                return feeds

        def find_articles(self, main_block):
                for a in main_block.findAllNext( attrs={'style':['','padding-top: 15px;']}):
                        if a.name in "td":
                                break
                        if self.EXCLUDE_LOCKED & self.is_blocked(a):
                                continue
                        yield {
                                'title' : self.tag_to_string(a),
                                'url'   : 'http://www.wprost.pl' + a['href'],
                                'date'  : '',
                                'description' : ''
                                }




04 maja 2011 3:41:04
Zobacz profil
Użytkownik

Dołączył(a): 19 paź 2010 21:00:49
Posty: 18
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Wspaniale, dzięki wielkie. A co zrobić, żeby pobrać numery z 2010? Próbowałem pogrzebać w kodzie i zmienić linijkę: soup = self.index_to_soup('http://www.wprost.pl/archiwum/'), ale nie działa. Podpowiesz jak to zrobić?


04 maja 2011 19:01:47
Zobacz profil
Użytkownik

Dołączył(a): 03 maja 2011 16:20:28
Posty: 8
eCzytnik: Kindle
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
na początku trzeba zmienić
FIND_LAST_FULL_ISSUE = True
na
FIND_LAST_FULL_ISSUE = False


a dalej podmienić funkcje find_last_issue

Kod:
        def find_last_issue(self):
                soup = self.index_to_soup('http://www.wprost.pl/archiwum/?Y=2010')
                a = 0
                app = QtGui.QApplication(sys.argv)
                widget = QtGui.QWidget()
                numer_get, ok=QtGui.QInputDialog.getInteger(widget, 'Ktory numer z archiwum?', 'Numer z archiwum: 1-ostatni, 2-przedostatni etc',1,min=1,max=52)
                if ok:
                  numer=numer_get
                else:
                  numer=1

                pages = range(1, numer)
                if self.FIND_LAST_FULL_ISSUE:
                        ico_blocked = soup.findAll('img', attrs={'src' : self.ICO_BLOCKED})
                        a = ico_blocked[-1].findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                else:
                        a = soup.find('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                for page in pages:
                        a = a.findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')})
                pref,data=a.img['alt'].split('numeru')
                self.title =  u'WPROST - numer'+data
                self.EDITION = a['href'].replace('/tygodnik/?I=', '')
                self.cover_url = a.img['src']


dla 2009 powinna wystarczyć zmiana
soup = self.index_to_soup('http://www.wprost.pl/archiwum/?Y=2010')
na
soup = self.index_to_soup('http://www.wprost.pl/archiwum/?Y=2009')

jeśli chcesz dalej sam próbować, to porównaj zmiany, zajrzyj tu http://calibre-ebook.com/user_manual/news.html i tu http://calibre-ebook.com/user_manual/news_recipe.html - może coś się wyjaśni :)


04 maja 2011 20:02:40
Zobacz profil
Użytkownik

Dołączył(a): 19 paź 2010 21:00:49
Posty: 18
Post Re: Calibre i Wprost na Kindle - rozwiązanie!
Dzięki zaslav, dobra robota. A czy da się wpleść podobny mechanizm do ściągania numerów archiwalnych Polityki albo Newsweeka?


07 maja 2011 18:52:26
Zobacz profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 


Kto przegląda forum

Użytkownicy przeglądający to forum: Brak zalogowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów

Skocz do:  
cron