elements \n",
"pipe = SyncPipe('xpathfetchpage', conf=xpath_conf)\n",
"\n",
"# truncate will allow us to get only \n",
"# the first n elements, which is 3 in this case\n",
"truncated = pipe.truncate(conf={'count': 3}) \n",
"\n",
"# The stream being output from the pipe\n",
"stream = truncated.output \n",
" \n",
"for item in stream: \n",
" date = item.get('{http://www.w3.org/1999/xhtml}span')['content']\n",
" article = (item['title'], date, item['href'])\n",
" print(article)\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is awesome! You can go to the website and see the list elements for yourself. For a website that is mostly auto-generated (disastrously, might I say), this was relatively easy to achieve!\n",
"\n",
"Let's look at one last example: let's fetch this list and dynamically fetch the articles it points to and get the full article:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Amok\n",
"====\n",
"Durup dururken…\n",
"*\n",
"Amok koşusu bu.\n",
"*\n",
"Malezya'da görülen bir tür çıldırma hali… Malezya'ya özgü tarihsel ve kültürel unsurlardan kaynaklanıyor. Manasız intihar saldırısı da deniyor. Kişi önce derin bunalıma sürükleniyor, kafasının içinde kurmaya başlıyor, gerçekte öyle olmadığı halde, kendisine yönelik gizli planlar yapıldığını, kendisini aşağıladıklarını, kendisine hakaret edildiğini düşünüyor, biriktiriyor biriktiriyor, ansızın patlıyor, güya kendini koruyor, vahşice, ayrım gözetmeden saldırıya geçiyor. İçinde yaşadığı topluma hayati zararlar vermesine rağmen, kendine geldiğinde ne yaptığını hatırlamıyor, palasından kan süzülürken, şaşkınlıkla “burda ne oldu böyle?” diye soruyor.\n",
"*\n",
"Bi kaç sene öncesine kadar Türkiye'nin en hararetli tartışma konularından biri “Malezya mı oluyoruz?” sorusuydu.\n",
"*\n",
"Henüz Malezya olmadık ama…\n",
"\n",
"hdp\n",
"===\n",
"Neymiş efendim, hdp milletvekilleri terörle arasına mesafe koymamış filan… Geçiniz efendim!\n",
"*\n",
"Zor yazıdır bu.\n",
"*\n",
"Zoruma giden yazıdır.\n",
"*\n",
"hdp'ye oy verip, “mitingte başka şeyler söyledin, seçildikten sonra gittin başka şeyler yaptın, bana yalan söyledin” diyen seçmen var mı kardeşim?\n",
"*\n",
"Sizin seçtikleriniz “Türk yoktur” diyor, “Türk demeyelim” diyor, “Anayasadan Türk'ü çıkaralım” diyor, Andımızı yasaklıyor, TC'yi kaldırıyor… “Kürt demesek de olur” diyen hdp milletvekili var mı?\n",
"*\n",
"“Apo namazında niyazında çocuktu, oruç tutardı, sahura kalkardı, derslerinden çıkar camiye koşardı” diyen… Bebek katiline adeta “melek” muamelesi yapan… Tescilli teröristbaşını ahaliye “dindar çocuk” diye kakalamaya çalışan hdp milletvekili gördünüz mü hiç?\n",
"*\n",
"feto'ya muhterem hocaefendi diyen… cemaat'le aynı menzile yürüyen… pensilvanya'ya gidip, el etek öpen, orası sanki kutsal mekanmış gibi başını örten… Türkçe olimpiyatında eline mikrofon alıp, gesi bağlarında dolanıyorum'u söyleyen… Sonra da “hay Allah, kandırılmışız, pardon” diyen hdp'liye rastladınız mı?\n",
"*\n",
"Bunlarla alakalı suç duyuruları çuvalla, dolaplara sığmıyor. Haklarında bir tane yolsuzluk dosyası var mı? Rüşvet alırken enselenen, kol saati takılan, zimmetine para geçirmekle suçlanan, ihaleye fesat karıştırdığı iddia edilen, meclis komisyonlarında iş takipçiliği yaparken görülen hdp milletvekili var mı?\n",
"*\n",
"Senin seçtiğin milletvekili, Mustafa Kemal Atatürk'ün TBMM duvarındaki tablosuna bile tahammül edemiyor birader… Ne yapsın hdp milletvekili, seninkilerin depoya attığı tabloya mı sahip çıksın?\n",
"*\n",
"Senin seçtiğin milletvekili, Türk Silahlı Kuvvetleri'nin madalyalı kahramanları iftirayla hapse atıldı diye neredeyse göbek attı, yetmedi, hakaret etti, aşağıladı. Kendi silahlı güçlerine toz konduruyor mu hdp milletvekilleri?\n",
"*\n",
"Senin partilerinde kadın-erkek eşitliği zaten yok da… Senin seçtiklerin arasında kadınla aynı masaya bile oturmayan, kadın eli sıkmayan, bıyığından utanmayıp kadın kontenjanından seçilen milletvekili bile var. Kadını her mevkide eşbaşkan yapıyor, kötü örnek oluyor diye mi öfkeleniyorsun?\n",
"*\n",
"Kıvırmadan cevap verelim.\n",
"*\n",
"Dönek mi hdp'liler?\n",
"*\n",
"hdp'yi yere göğe sığdıramayan, övgüler düzen akil'ler, senin verdiğin oylarla senin partinden milletvekili olmadı mı? Pkk'nın Kandil'deki basın toplantısına koştura koştura gidenler, senin yandaş gazetecilerin değil mi? Devletin resmi haber ajansı, Anadolu Ajansı bile Kandil'de pkk bayrağının önünden canlı yayın yapmadı mı? Analar ağlamasın ayağıyla Türk milletini kandırmaya çalışanlar, 50 bin insanımızın katledilmesinden sorumlu terör örgütünü “sivil toplum örgütü” gibi göstermeye çalışanlar, hdp milletvekilleri miydi?\n",
"*\n",
"Bunlarla Dolmabahçe'de yan yana poz verenler kimlerdi? Memleketin hayrına şahane şeyler yapılıyormuş gibi, devletin resmi televizyonu TRT tarafından canlı yayınlanmadı mı?\n",
"*\n",
"Senin Türk milletini temsilen seçtiklerin, Türk milletinin evlatlarına zorla Arapça'yı dayatırken… 40 senedir dağda yaşayan Murat Karayılan'ın Cemil Bayık'ın, senin seçtiğin milletvekillerinden bile daha güzel Türkçe konuşması tuhaf değil mi?\n",
"*\n",
"*\n",
"Hdp dün de pkk bayisiydi.\n",
"*\n",
"Sorunu çözmek istiyorsan…\n",
"\n",
"Darbe komisyonu\n",
"===============\n",
"Meclis darbe komisyonuna çağırıyorlar, insanlar geliyor, istisnasız hepsi aynı şeyi anlatıyor, “isim isim söyledik, raporlar yazdık, uyardık, kimse oralı bile olmadı.”\n",
"*\n",
"Minik bi fare varmış…\n",
"*\n",
"Duvardaki çatlaktan mutfağa bakarken, çiftçiyle eşinin paket açtıklarını görmüş. Kendi kendine sevinmiş, sanırım akşama ziyafet çekeceğim, kimbilir ne güzel yiyecekler vardır o paketin içinde demiş. Ama… Ambalajı bi yırtmışlar ki, paketten çıka çıka kapan çıkmış!\n",
"*\n",
"“Kardeşim… İş işten geçip herkesin hayatı kaydıktan sonra, benim akıbetimi anca merak etmeniz enteresan yani” demiş!\n",
"\n"
]
}
],
"source": [
"# Article list elements stream\n",
"# The XPath configuration for the article list\n",
"xpath_conf_list = {'xpath': xpath, 'url': url}\n",
"\n",
"# A pipe that streams the article list elements\n",
"pipe_list = SyncPipe('xpathfetchpage', conf=xpath_conf_list)\n",
"\n",
"# The stream being output from the pipe\n",
"stream_list = pipe_list.output\n",
"\n",
"# The article stream\n",
"# XPath of article body\n",
"xpath_article = '/html/body/div[5]/div[6]/div[3]/div/div[2]/div[1]/div/div[2]/div[2]'\n",
"\n",
"# The XPath configuration for the articles\n",
"# Notice how we can refer to a 'subkey' as the URL of this configuration\n",
"xpath_conf_article = {'url': {'subkey': 'href'}, 'xpath': xpath_article}\n",
"\n",
"# A pipe that streams the articles linked to by the list stream\n",
"# Notice how we create this pipe by chaining a pipe on top of the list pipe;\n",
"# how this one is 'dependent' on the list pipe\n",
"pipe_article = pipe_list.xpathfetchpage(conf=xpath_conf_article)\n",
"\n",
"# truncate will allow us to get only \n",
"# the first n elements, which is 3 in this case\n",
"truncated_article = pipe_article.truncate(conf={'count': 3}) \n",
"\n",
"# The stream being output from the article pipe\n",
"stream_article = truncated_article.output \n",
"\n",
"# Create a zipped iterator from the two pipes\n",
"for list_item, article in zip(stream_list, stream_article):\n",
" # Get the list of elements under this XPath \n",
" elements = article.get('{http://www.w3.org/1999/xhtml}p')\n",
"\n",
" # Grab only the strings under the
elements\n",
" string_els = (el for el in elements if not hasattr(el, 'values'))\n",
"\n",
" # Join strings to create the whole article\n",
" article_body = '\\n'.join(string_els)\n",
"\n",
" # Create the article's (title, body) tuple\n",
" title = list_item['title']\n",
" print(title)\n",
" print('=' * len(title))\n",
" print(article_body) \n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now have a script to fetch the articles and read them easily, without needing to go to the website. Can this be the most effective ad blocker?\n",
"***\n",
"The power of Riko and its pipes may not be immediately visible through parsing just a website but as you explore different options, you can appreciate the power it gives you, the developer, over the mess that is HTML and the World Wide Web. "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}