Menambah laman sesawang berita kegemaran anda¶
calibre mempunyai bingkai kerja yang hebat, fleksibel dan mudah digunakan untuk memuat turun berita dari Internet dan menukar ia menjadi e-buku. Yang berikut akan menunjukkan kepada anda, dengan contoh bagaimana hendak dapatkan berita dari pelbagai laman sesawang.
Untuk memahami bagaimana hendak guna bingkai kerja, ikuti contoh yang tersenarai tertib di bawah:
Pemerolehan automatik sepenuhnya¶
Jika sumber berita anda adalah ringkas, calibre boleh mendapatkannya dengan sepenuhnya secara automatik, apa yang anda perlu sediakan adalah URL. calibre menghimpun semua maklumat yang diperlukan untuk memuat turun sumber berita dalam bentuk resepi. Untuk memberitahu calibre berkenaan sumber beritah, anda perlu cipta resepi untuknya. Ok, mari kita lihat beberapa contoh yang disediakan:
Blog calibre¶
Blog calibre adalah blog pos yang menjelaskan banyak fitur calibre yang berguna dalam cara yang mudah dan boleh dicapai untuk pengguna baru calibre. Untuk memuat turun blog ini menjadi e-buku, kami bergantung pada suapan RSS blog:
http://blog.calibre-ebook.com/feeds/posts/default
Saya perolehi URL RSS dengan meneliti "Subscribe to" di bahagian bawah laman blog dan pilih Posts → Atom. Supaya calibre dapat memuat turun suapan dan menukarkanya menjadi e-buku, anda boleh klik-kanan butang Dapatkan berita kemudian item menu Tambah sumber berita suai dan kemudian butang Resepi Baharu. Satu dialog serupa dengan yang telah ditunjukkan akan dibuka.
First enter Calibre Blog
into the Recipe title field. This will be the title of the e-book that will be created from the articles in the above feeds.
Dua medan berikutnya (Oldest article dan Max. number of articles) membolehkan anda kawal berapa banyak artikel yang patut dimuat turun dari setiap suapan.
Untuk menambah suapan ke dalam resepi, masukkan tajuk suapan dan URL suapan kemudian klik butang Tambah suapan. Selepas itu, hanya klik butang Simpan dan kerja anda telah selesai! Tutup dialog.
Untuk menguji resepi baharu anda, klik butang Dapatkan berita dan pada sub-menu Suai sumber baharu klik calibre Blog. Selepas beberapa minit, e-buku baharu dimuat turun akan muncul dalam paparan pustaka utama (jika anda memiliki pembaca yang telah bersambung, ia akan dimasukkan ke dalam pembaca selain dari ke dalam pustaka). Pilih e-buku tersebut dan tekan butang :guilabel:`Lihat' untuk membaca!
Sebab apa proses ini menghasilkan e-buku yang baik, kerana blog ini menyediakan suapan RSS dengan kandungan-lengkap iaitu, kandungan artikel sebenar terbenam dalam suapan itu sendiri. Bagi kebanyakan sumber berita yang menyediakan berita dengan suapan dengan kandungan-lengkap, anda tidak perlu buat lebih kerja untuk menukar ia menjadi e-buku. Sekarang kita lihat sumber berita yang tidak menyediakan suapan dengan kandungan-lengkap. Suapan sebegini, artikel lengkap berada dalam laman sesawang dan suapan hanya menyediakan pautan ke laman sesawang dengan ringkasan pendek artikel berkenaan.
bbc.co.uk¶
Let's try the following two feeds from The BBC:
Laman Muka Hadapan Berita: https://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml
Sains/Alam: https://newsrss.bbc.co.uk/rss/newsonline_world_edition/science/nature/rss.xml
Ikuti prosedur yang digariskan dalam Blog calibre seperti di atas untuk menghasilkan resepi untuk The BBC (menggunakan suapan tersebut). Berdasarkan pada e-buku yang dimuat turun, didapati calibre telah melakukan kerja yang bagus hanya mengekstrak kandungan yang dikehendaki bagi setiap artikel dalam laman sesawang. Walaubagaimanapun, proses pengekstrakan ini tidaklah seratus peratus sempurna. Kadangkala ia meninggalkan kandungan yang tidak dikehendaki seperti menu dan bantuan navigasi atau ia telah buang kandungan yang sepatutnya diambil seperti tajuk artikel. Untuk memastikan pengekstrakan kandungan menepati kehendak anda, kita perlu suaikan proses mendapatkan artikel, yang dijelaskan pada seksyen yang berikutnya.
Penyuaian proses mendapatkan artikel¶
Bila anda mahukan proses muat turun yang sempurna, atau muat turun kandungan dari laman sesawang yang kompleks, anda perlu biasakan dengan bingkai kerja resepi yang fleksibel. Untuk membuatnya, pada dialog Tambah sumber berita suai, hanya klik butang Tukar ke mod Lanjutan.
Penyuaian termudah dan paling produktif ialah dengan menggunakan versi cetak artikel atas-talian. Versi cetak biasanya kurang kompleks dan mudah diterjemah menjadi e-buku. Cuba guna versi cetak daripada The BBC.
Menggunakan versi cetak bbc.co.uk¶
Langkah pertama adalah melihat e-buku yang telah dimuat turun sebelum ini daripada bbc.co.uk. Dipenghujung setiap artikel, dalam e-buku terdapat lokasi artikel dimuat turun. Salin dan tampal URL tersebut ke dalam pelayar. Sekarang laman sesawang artikel akan menuju ke "Versi Boleh Cetak". Klik padanya untuk melihat versi cetak artikel. Ia kelihatan lebih kemas! Sekarang bandingkan kedua-dua URL yang mana:
Jika mahukan versi cetak, kita perlu tambah setiap URL artikel dengan:
newsvote.bbc.co.uk/mpapps/pagetools/print/
Now in the Advanced mode of the Custom news sources dialog, you should see something like (remember to select The BBC recipe before switching to advanced mode):
Anda dapati medan dari Mod asas telah diterjemah dalam kod bahasa Python. Kita perlu tambah arahan ke dalam resepi ini supaya dapat guna versi cetak artikel. Apa yang diperlukan adalah dengan menambah dua baris berikut:
def print_version(self, url):
return url.replace('https://', 'https://newsvote.bbc.co.uk/mpapps/pagetools/print/')
Ini adalah bahasa Python, oleh itu penggunaan indentasi adalah penting. Selepas anda menambah baris, ia sepatutnya kelihatan seperti berikut:
In the above, def print_version(self, url)
defines a method that is called by calibre for every article. url
is the URL of the original article. What print_version
does is take that url and replace it with the new URL that points to the print version of the article. To learn about Python see the tutorial.
Sekarang, klik butang Tambah/kemaskini resepi dan perubahan yang anda buat akan disimpan. Muat semula e-buku. E-buku tersebut telah diperkemaskan. Salah satu masalah dengan versi baharu ialah fon yang digunakan pada versi cetak terlalu kecil. Ia dibaiki secara automatik bila menukar menjadi e-buku, tetapi selepas proses pembaikan, saiz fon bagi menu dan palang navigasi menjadi terlalu besar berbanding teks artikel. Untuk membaikinya, kita perlu lakukan lagi penyuaian, pada seksyen berikutnya.
Menggantikan gaya artikel¶
Dalam seksyen terdahulu, kita dapati saiz fon artikel dalam versi cetak The BBC terlalu kecil. Dalam kebanyakan laman sesawang, The BBC juga, saiz fon ini ditetapkan melalui lembaran gaya CSS. Kita boleh lumpuhkan pengambilan lembaran gaya tersebut dengan menambah baris:
no_stylesheets = True
Resepi kini kelihatan seperti:
Versi baharu kelihatan menarik. Jika anda mementingkan kesempurnaan, anda perlu baca seksyen berikutnya yang melibatkan pengubahsuaian sebenar kandungan muat turun.
Menghiris dan mencincang¶
calibre memiliki keupayaan yang hebat dan fleksibel bila memanipulasikan kandungan muat turun. Sebagai contoh, kita rujuk kembali The BBC sekali lagi. Berdasarkan pada kod sumber (HTML) beberapa artikel (versi cetak), didapati mereka mempunyai pengkaki yang tidak diperlukan, terkandung didalamnya
<div class="footer">
...
</div>
Ia boleh dibuang dengan menambah:
remove_tags = [dict(name='div', attrs={'class':'footer'})]
ke dalam resepi. Akhir sekali, gantikan beberapa CSS yang telah dilumpuhkan sebelum ini, dengan CSS anda sendiri yang sesuai dengan penukaran sesebuah e-buku:
extra_css = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt }'
With these additions, our recipe has become "production quality".
Resepi ini hanya menjelajah sebahagian kecil sahaja bila dibandingkan kelebihan yang ada pada calibre. Untuk menjelajah lebih mendalam keupayaan calibre kita perlu menyelidiki contoh sebenar yang lebih kompleks pada seksyen berikutnya.
Contoh sebenar¶
Contoh sebenar yang benar-benar kompleks yang mendedahkan lebih API BasicNewsRecipe
adalah resepi untuk The New York Times
import string, re
from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
class NYTimes(BasicNewsRecipe):
title = 'The New York Times'
__author__ = 'Kovid Goyal'
description = 'Daily news from the New York Times'
timefmt = ' [%a, %d %b, %Y]'
needs_subscription = True
remove_tags_before = dict(id='article')
remove_tags_after = dict(id='article')
remove_tags = [dict(attrs={'class':['articleTools', 'post-tools', 'side_tool', 'nextArticleLink clearfix']}),
dict(id=['footer', 'toolsRight', 'articleInline', 'navigation', 'archive', 'side_search', 'blog_sidebar', 'side_tool', 'side_index']),
dict(name=['script', 'noscript', 'style'])]
encoding = 'cp1252'
no_stylesheets = True
extra_css = 'h1 {font: sans-serif large;}\n.byline {font:monospace;}'
def get_browser(self):
br = BasicNewsRecipe.get_browser()
if self.username is not None and self.password is not None:
br.open('https://www.nytimes.com/auth/login')
br.select_form(name='login')
br['USERID'] = self.username
br['PASSWORD'] = self.password
br.submit()
return br
def parse_index(self):
soup = self.index_to_soup('https://www.nytimes.com/pages/todayspaper/index.html')
def feed_title(div):
return ''.join(div.findAll(text=True, recursive=False)).strip()
articles = {}
key = None
ans = []
for div in soup.findAll(True,
attrs={'class':['section-headline', 'story', 'story headline']}):
if ''.join(div['class']) == 'section-headline':
key = string.capwords(feed_title(div))
articles[key] = []
ans.append(key)
elif ''.join(div['class']) in ['story', 'story headline']:
a = div.find('a', href=True)
if not a:
continue
url = re.sub(r'\?.*', '', a['href'])
url += '?pagewanted=all'
title = self.tag_to_string(a, use_alt=True).strip()
description = ''
pubdate = strftime('%a, %d %b')
summary = div.find(True, attrs={'class':'summary'})
if summary:
description = self.tag_to_string(summary, use_alt=False)
feed = key if key is not None else 'Uncategorized'
if feed not in articles:
articles[feed] = []
if not 'podcasts' in url:
articles[feed].append(
dict(title=title, url=url, date=pubdate,
description=description,
content=''))
ans = self.sort_index_by(ans, {'The Front Page':-1, 'Dining In, Dining Out':1, 'Obituaries':2})
ans = [(key, articles[key]) for key in ans if key in articles]
return ans
def preprocess_html(self, soup):
refresh = soup.find('meta', {'http-equiv':'refresh'})
if refresh is None:
return soup
content = refresh.get('content').partition('=')[2]
raw = self.browser.open('https://www.nytimes.com'+content).read()
return BeautifulSoup(raw.decode('cp1252', 'replace'))
Kami melihat beberapa fitur baharu dalam resepi ini. Mula-mula, kita perlu:
timefmt = ' [%a, %d %b, %Y]'
Ini tetapkan masa paparan pada muka hadapan e-buku yang dihasilkan dalam format, Day, Day_Number Month, Year
. Sila rujuk timefmt
.
Kemudian kita lihat sekumpulan arahan untuk membersihkan HTML dimuat turun:
remove_tags_before = dict(name='h1')
remove_tags_after = dict(id='footer')
remove_tags = ...
Ia membuang segalanya sebelum <h1>
tag pertama dan segalanya selepas tag pertama yang mana id ialah footer
. Sila rujuk remove_tags
, remove_tags_before
, remove_tags_after
.
Fitur menarik berikutnya ialah:
needs_subscription = True
...
def get_browser(self):
...
needs_subscription = True
memberitahui calibre bahawa resepi ini perlukan nama pengguna dan kata laluan supaya ia dapat capai kandungan tersebut. Oleh itu, calibre meminta nama pengguna dan kata laluan bila anda cuba guna resepi ini. Kod di dalam calibre.web.feeds.news.BasicNewsRecipe.get_browser()
sebenarnya mendaftar masuk ke laman sesawang the NYT. Seusai mendaftar masuk, calibre akan menggunakannya semula untuk dapatkan semua kandungan. Sila rujuk mechanize untuk memahami kod di dalam get_browser
.
The next new feature is the
calibre.web.feeds.news.BasicNewsRecipe.parse_index()
method. Its job is
to go to https://www.nytimes.com/pages/todayspaper/index.html and fetch the list
of articles that appear in todays paper. While more complex than simply using
RSS, the recipe creates an e-book that corresponds very closely to the
days paper. parse_index
makes heavy use of BeautifulSoup to parse
the daily paper webpage. You can also use other, more modern parsers if you
dislike BeautifulSoup. calibre comes with lxml and
html5lib, which are the
recommended parsers. To use them, replace the call to index_to_soup()
with
the following:
raw = self.index_to_soup(url, raw=True)
# For html5lib
import html5lib
root = html5lib.parse(raw, namespaceHTMLElements=False, treebuilder='lxml')
# For the lxml html 4 parser
from lxml import html
root = html.fromstring(raw)
Fitur baharu terakhir ialah kaedah calibre.web.feeds.news.BasicNewsRecipe.preprocess_html()
. Ia boleh digunakan untuk melakukan transformasi arbitari pada setiap halaman HTML dimuat turun. Di sini ia digunakan untuk melangkaui iklan yang mana nytimes paparkan sebelum setiap artikel.
Petua untuk membangunkan resepi baharu¶
Cara terbaik membangunkan resepi baharu adalah dengan penggunaan antaramuka baris perintah. Cipta resepi mengguna penyunting Python kegemaran anda dan simpan ia ke dalam fail seperti resepisaya.recipe
. Sambungan .recipe diperlukan. Kemudian anda boleh muat turun kandungan menggunakan resepi dengan perintah:
ebook-convert myrecipe.recipe .epub --test -vv --debug-pipeline debug
Perintah ebook-convert akan muat turun semua laman sesawang dan simpan ia ke dalam fail EPUB resepisaya.epub
. Pilihan -vv
menjadikan ebook-convert buang banyak maklumat berkenaan kerjanya. Pilihan --test
menyuruh ia muat turun hanya beberapa pasangan artikel paling banyak dari dua suapan. Selain itu, ebook-convert akan masukkan HTML dimuat turun ke direktori debug/input
, iaitu debug
adalah direktori yang anda nyatakan dalam pilihan ebook-convert --debug-pipeline
.
Selepas muat turun selesai, anda boleh lihat HTML dimuat turun dengan membuka fail debug/input/index.html
di dalam pelayar. Jika anda puashati dengan muat turun dan pra-pemprosesan yang berlaku sepertimana yang diharapkan, anda boleh jana e-buku dalam format berlainan seperti di bawah:
ebook-convert myrecipe.recipe myrecipe.epub
ebook-convert myrecipe.recipe myrecipe.mobi
...
Jika anda puashati dengan resepi anda, dan anda dapati masih terdapat ruang untuk ruang penambahbaikan dalam set resepi terbina-dalam, poskan resepi anda ke forum resepi calibre recipes untuk berkongsi ia dengan lain-lain pengguna calibre.
Note
Pada MacOS, alat baris perintah disediakan dalam berkas calibre, contohnya, jika anda memasang calibre di dalam /Applications
alat baris perintah berada di dalam /Applications/calibre.app/Contents/MacOS/
.
See also
- ebook-convert
Antaramuka baris perintah untuk semua pertukaran format e-buku.
Bacaan lanjutan¶
Untuk mengetahui lebih lanjut berkenaan penulisan resepi lanjutan dengan menggunakan beberapa fasiliti, yang tersedia dalam BasicNewsRecipe
anda perlu ke beberapa sumber berikut:
- Dokumentasi API
Dokumentasi kelas
BasicNewsRecipe
dan semua kaedah dan medan pentingnya.- BasicNewsRecipe
Kod sumber
BasicNewsRecipe
- Resepi terbina-dalam
Kod sumber untuk resepi terbina-dalam yang disertakan dengan calibre
- Forum resepi calibre
Lebih banyak penulis resepi calibre yang berpengetahuan datang ke sini.