Teraz jest 28 mar 2024 12:52:46




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Recipe dla newsweeka 
Autor Wiadomość
Użytkownik

Dołączył(a): 17 lip 2010 21:56:44
Posty: 36
eCzytnik: PocketBook InkPad 3, Kindle 4, DXG
Post Recipe dla newsweeka
t3d: wydzielone z wątku o polskich treściach w Calibre

Od paru tygodni Calibre ściąga mi ostatni numer Newsweek'a z zeszłego roku, chociaż wcześniej ściągał mi już tegoroczne. Czy ktoś ma może poprawioną wersję recipe?


26 lut 2012 17:32:49
Zobacz profil
Użytkownik

Dołączył(a): 21 lut 2012 12:16:19
Posty: 11
eCzytnik: Kindle 3
Post Re: Polskie treści w calibre - komentarze
KecajN napisał(a):
Od paru tygodni Calibre ściąga mi ostatni numer Newsweek'a z zeszłego roku, chociaż wcześniej ściągał mi już tegoroczne. Czy ktoś ma może poprawioną wersję recipe?


Recepta zamieszczona w calibre sprawdza czy w magazynie są zablokowane artukuły; jeśli tak to szuka następnego numeru w którym liczba zablokowanych artykułów jest nie większa niż 1 (!). Ostatnie numery posiadają kilka zablokowanych artykułów i dlatego pobierany jest ostatni numer w którym warunek był spełniony. Proponuję więc zmienić limit ilości niedostępnych artykułów z 1 na przykładowo 6. W tym celu w procedurze def is_full należy zmienić 1 na większą liczbę w linii:
if len(main_section.findAll(attrs={'class' : 'locked'})) > 1:


26 lut 2012 17:58:12
Zobacz profil
Użytkownik

Dołączył(a): 17 lip 2010 21:56:44
Posty: 36
eCzytnik: PocketBook InkPad 3, Kindle 4, DXG
Post Re: Polskie treści w calibre - komentarze
Krzysk napisał(a):
KecajN napisał(a):
Od paru tygodni Calibre ściąga mi ostatni numer Newsweek'a z zeszłego roku, chociaż wcześniej ściągał mi już tegoroczne. Czy ktoś ma może poprawioną wersję recipe?


Recepta zamieszczona w calibre sprawdza czy w magazynie są zablokowane artukuły; jeśli tak to szuka następnego numeru w którym liczba zablokowanych artykułów jest nie większa niż 1 (!). Ostatnie numery posiadają kilka zablokowanych artykułów i dlatego pobierany jest ostatni numer w którym warunek był spełniony. Proponuję więc zmienić limit ilości niedostępnych artykułów z 1 na przykładowo 6. W tym celu w procedurze def is_full należy zmienić 1 na większą liczbę w linii:
if len(main_section.findAll(attrs={'class' : 'locked'})) > 1:


Po zwiększeniu do 20 nic się nie zmieniło. Mam ciągle jeszcze te ściągnięte na początku roku (1-3) na podstawie oryginalnej recepty. Sprawdziłem numer 3/2012: Artykułów zablokowanych po prostu nie ściągnął, reszta jest...


27 lut 2012 0:48:48
Zobacz profil
Użytkownik

Dołączył(a): 21 lut 2012 12:16:19
Posty: 11
eCzytnik: Kindle 3
Post Re: Polskie treści w calibre - komentarze
KecajN napisał(a):
Krzysk napisał(a):

Recepta zamieszczona w calibre sprawdza czy w magazynie są zablokowane artukuły; jeśli tak to szuka następnego numeru w którym liczba zablokowanych artykułów jest nie większa niż 1 (!). Ostatnie numery posiadają kilka zablokowanych artykułów i dlatego pobierany jest ostatni numer w którym warunek był spełniony. Proponuję więc zmienić limit ilości niedostępnych artykułów z 1 na przykładowo 6. W tym celu w procedurze def is_full należy zmienić 1 na większą liczbę w linii:
if len(main_section.findAll(attrs={'class' : 'locked'})) > 1:


Po zwiększeniu do 20 nic się nie zmieniło. Mam ciągle jeszcze te ściągnięte na początku roku (1-3) na podstawie oryginalnej recepty. Sprawdziłem numer 3/2012: Artykułów zablokowanych po prostu nie ściągnął, reszta jest...


Rzeczywiście w niektórych magazynach pojawiają się jeszcze problemy z procedurą create_article. Zamieszczam kompletną zmodyfikowaną przeze mnie receptę, która powinna działać poprawnie Spoiler!
Kod:
# -*- coding: utf-8 -*-
#!/usr/bin/env  python

__license__   = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com'

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
import datetime


class Newsweek(BasicNewsRecipe):
   EDITION = '0'
   DATE = None
   YEAR = datetime.datetime.now().year

   title = u'Newsweek Polska'
   __author__ = 'matek09'
   description = 'Weekly magazine <br>' #(kk)
   encoding = 'utf-8'
   language = 'pl'
   remove_javascript = True
   masthead_url = 'http://ipn.blox.pl/resource/newsweek_logo_250x250.jpg' #(kk)

   temp_files = []
   articles_are_obfuscated = True


   def get_obfuscated_article(self, url):
      br = self.get_browser()
      br.open(url)
      source = br.response().read()
      page = self.index_to_soup(source)

      main_section = page.find(id='mainSection')
      
      title = main_section.find('h1')
      info = main_section.find('ul', attrs={'class' : 'articleInfo'})
      authors = info.find('li').find('h4')
      article = main_section.find('div', attrs={'id' : 'article'})
      if article.find('div', attrs={'class':'relatedBox'}) is not None:
         article.find('div', attrs={'class':'relatedBox'}).replaceWith('')
      html =  unicode(title) + unicode(authors) + unicode(article)
      next = main_section.find('li', attrs={'class' : 'next'})
      
      while next:
         url = next.find('a')['href']
         br.open(url)
         source = br.response().read()
         page = self.index_to_soup(source)
         main_section = page.find(id='mainSection')
         article = main_section.find('div', attrs={'id' : 'article'})
         aside = article.find(id='articleAside')
         if aside is not None:
            aside.extract()
         html = html + unicode(article)
         next = main_section.find('li', attrs={'class' : 'next'})
      
      
      self.temp_files.append(PersistentTemporaryFile('_temparse.html'))
      self.temp_files[-1].write(html)
      self.temp_files[-1].close()
      return self.temp_files[-1].name
      
   def is_full(self, issue_soup):
      while True:
         main_section = issue_soup.find(id='mainSection')
         next = main_section.find('li', attrs={'class' : 'next'})
         if len(main_section.findAll(attrs={'class' : 'locked'})) > 6: #KK Ile może być zablokowanych artykułów
            return False
         elif next is None:
            return True
         else:
            issue_soup = self.index_to_soup(next.find('a')['href'])

   def find_last_full_issue(self, archive_url):
      archive_soup = self.index_to_soup(archive_url)
      select = archive_soup.find('select', attrs={'id' : 'paper_issue_select'})
      for option in select.findAll(lambda tag: tag.name == 'option' and tag.has_key('value')):
         self.EDITION = option['value'].replace('http://www.newsweek.pl/wydania/','')
         issue_soup = self.index_to_soup('http://www.newsweek.pl/wydania/' + self.EDITION)
         if self.is_full(issue_soup):
            return
            
      self.YEAR = self.YEAR - 1
      self.find_last_full_issue(archive_url + ',' + str(self.YEAR))
      
   def parse_index(self):
      archive_url = 'http://www.newsweek.pl/wydania/archiwum'
      self.find_last_full_issue(archive_url)
      soup = self.index_to_soup('http://www.newsweek.pl/wydania/' + self.EDITION)
      self.DATE = self.tag_to_string(soup.find('span', attrs={'class' : 'data'}))
      main_section = soup.find(id='mainSection')
      img = main_section.find(lambda tag: tag.name == 'img' and tag.has_key('alt') and tag.has_key('title'))
      self.cover_url = img['src']
      feeds = []
      articles = {}
      sections = []
      while True:
         news_list = main_section.find('ul', attrs={'class' : 'newsList'})
         for h2 in news_list.findAll(['h2','h3']):   
            if h2.a is None :
               section = self.tag_to_string(h2)
               continue
            if section == '' :
               continue
            if not articles.has_key(section) :
               sections.append(section)
               articles[section] = []
            article = self.create_article(h2)
            articles[section].append(article)
      
         next = main_section.find('li', attrs={'class' : 'next'})
         if next is None:
            break
         soup = self.index_to_soup(next.find('a')['href'])
         main_section = soup.find(id='mainSection')
         
      for section in sections:
         feeds.append((section, articles[section]))
      return feeds

   def create_article(self, h2):
                   article = {}
                   a = h2.find('a')
                   if a is not None:  #(kk) dodałem sprawdzanie warunku
                       article['title'] = self.tag_to_string(a)
                       article['url'] = a['href']
                       article['date'] = self.DATE
                       article['author'] = self.tag_to_string(h2.findNext('p') ) #(kk) dodałem

                       article_page = self.index_to_soup(article['url'])  #(kk) dodałem szukanie description
                       article['description'] = self.tag_to_string(article_page.find('div', attrs={'class' : ['art_lead', 'lead']}) )
                   return article

   def populate_article_metadata(self, article, soup, first): #(kk) dodałem
           if first and hasattr(self, 'add_toc_thumbnail'):
               picdiv = soup.find('img')
               if picdiv is not None:
                   self.add_toc_thumbnail(article,picdiv['src'])


27 lut 2012 13:06:47
Zobacz profil
Użytkownik

Dołączył(a): 16 lip 2011 14:21:10
Posty: 133
eCzytnik: Kindle 3
Post Re: Recipe dla newsweeka
Dobrze by było gdyby ktoś (w domyśle Krzysk jako autor poprawki) uderzył z tym kodem do Kovida. Oryginalnym autorem recepty jest matek09, który już się nie zajmuje receptami (zapytałem się go o to gdy recepta dla Histamu, której jest także autorem, była popsuta). Od siebie dodałbym jeszcze
Kod:
remove_empty_feeds= True
, ale to detal. Przy okazji, poprawiłem receptę dla National Geographic autorstwa skrabka, który mi napisał, że również nie ma czasu na pisanie recept i żeby aplikować poprawki we własnym zakresie. Tak też zrobię.


06 kwi 2012 8:20:31
Zobacz profil
Użytkownik

Dołączył(a): 01 mar 2012 15:27:20
Posty: 62
eCzytnik: kt4
Post Re: Recipe dla newsweeka
a gdzie te recepty?


07 kwi 2012 15:10:47
Zobacz profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 


Kto przegląda forum

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


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: