Python mechanize ile Türkçe karakter çözümü
Python Dersleri 004 – Mechanize paketi ile Türkçe erişim
Bu dersimizde, mechanize paketi kullanarak Türkçe karakter sorununu çözüyoruz.
Ayrıca, PyCharm üzerinden paket ekleme ve kaldırma işlemlerinin nasıl yapıldığını da yine bu dersimizde işliyoruz.
[youtube https://www.youtube.com/watch?v=1jNCrY07ck0&w=560&h=315]
Türkçe karakter sorununun çözümünün aslında mechanize paketinden değil, bu paket aracılığıyla kolayca tanımlanabilen “headers” parametrelerinden kaynaklandığını belirtmekte yarar var. Headers bilgilerini tanımlamanıza izin veren tüm paketler, Türkçe karakter sorununuzu çözmenizde yardımcı olacaktır.
Kritik bilgiler şunlar:
(‘Accept-Language’, ‘tr,en-us,en;q=0.5’),
(‘Accept-Charset’, ‘cp1254,ISO-8859-9,utf-8;q=0.7,*;q=0.7’)
Yeri gelmişken, python sürümleri ile ilgili bir kaç noktaya değinmekte yarar var.
Bildiğiniz gibi, daha fazla kaynak bulunabildiği için, derslerimizi python 2 serisi üzerinden sürdürüyoruz. Ancak python grubu, asıl enerjisini python 3 üzerine yoğunlaştırmış durumda. Bu nedenle, python yolculuğu aslında üçüncü kulvar üzerinden yeni ufuklara ulaşmayı planlıyor. Bunu unutmamakta yarar var.
Derslerimizde her iki seride de çalışabilecek kodlara yer vermeye çalışacağım. Mechanize bu açıdan uygun bir paket değil ne yazık ki! Mechanize ekibi, kodlarını python 3 serisine uyarlamayı düşünmüyor. Bazı fork denemeleri var, ama yeterince destekleri bulunmuyor.
Python 3 için mechanize paketine bir alternatif olarak MechanicalSoup öneriliyor. MechanicalSoup paketine aşağıdaki linkten ulaşabilirsiniz:
https://www.facebook.com/l.php?u=https%3A%2F%2Fgithub.com%2Fhickford%2FMechanicalSoup&h=8AQGqTvIl
Dördüncü dersimizde işlediğimiz kodların tamamı aşağıda yer alıyor:
# -*- coding: utf-8 -*- import mechanize import re #url ='http://www.bbc.com' url ='http://www.milliyet.com.tr' br = mechanize.Browser() br.set_handle_equiv(True) br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) # Browserin takılmasını önlemek için br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) #Header bilgilerini tanımlamak br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'), ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Language', 'tr,en-us,en;q=0.5'), ('Accept-Charset', 'cp1254,ISO-8859-9,utf-8;q=0.7,*;q=0.7')] ob = br.open(url) page = ob.read() #Buradan itibaren tüm kodlar bir önceki derstekinin aynısıdır print (len(page)) #regex='div class="grid_5.*?">(.+?)</div>' regex='div class="cHaber.+?">(.+?)</div>' pattern = re.compile(regex) haber=re.findall(pattern,page) print (len(haber)) i = 0 while i < len(haber): detay=haber[i] pattern=re.compile('href="(.+?)"') haberlink=re.findall(pattern,detay) pattern2=re.compile('<a.*?>(.+?...)</a>') habertext=re.findall(pattern2,detay) print ("link =",haberlink[0]) print ("kategori=",habertext[0]) if len(habertext)>1: print ("baslik=",habertext[1]) if len(habertext)>2: print ("ozet =",habertext[2]) j=2 while j<len(habertext): print ("detay =",habertext[j]) j+=1 print ("") i+=1
Bir sonraki dersimizde görüşmek üzere!
Beni izlemeyi unutmayın!
ahmet aksoy
İyi günler kodu direkt alıp çalıştımayı denedim ancak iki konuda hata aldım ilki
UserWarning: gzip transfer encoding is experimental!
br.set_handle_gzip(True)
Şeklinde
İkincisi ise Türkçe karakter sorunu düzelmedi. Neden olabileceği ile ilgili yardımcı olabilirseniz sevinirim.
İlk uyarı kulladığınız sistemle ilgili olabilir. O satırı silip deneyebilirsiniz. Kritik bir bilgi içermiyor.
Türkçe sorununuzun çözülmemesi kodlarda kullanılan parametrelerle ilgili olabilir.
Hem br.set_handle_??? satırlarını, hem de br.addheaders(…) parametreleriyle oynayarak sonuç almayı deneyebilirsiniz.
Ben bu kodları windows7 üzerinde test ettim.
ahmet aksoy
Merhaba Ahmet Bey,
Bende windows 7 üzerinde sizin kodlarınızı derledim fakat türkçe karakter sorunu düzelmedi. addheaders(…) parametreleriylede oynadım fakat türkçe karakterler gelmiyor. Yardımcı olabilir misiniz. Teşekkür ederim.
Hangi python sürümünü kullanıyorsunuz?
Eğer hala 2.7 ile çalışıyorsanız en azından 3.4’e geçmenizi öneririm.
Ben Python 3.5 ile çalışıyorum ve Türkçe karakter sorununu neredeyse hiç yaşamıyorum.
Python 3.4 kullanıyorum.
Teşekkür ederim.
Sorunu html.parser modülüyle hallettim. Ve html.parser kesin çözüm hiç bir sorun çıkarmıyor.