2012-07-21 17 views
5

Kodlamalarla çok uzun süre uğraştım ve bugün zihinsel bloğu geniş açık bırakmak istiyorum.Python İstekleri kitaplığı kullanılarak kodlamalar nasıl yapılır

Şu anda bir grup web sitesini kazımak için Requests kullanıyorum ve bu sayfaların kullandığı kodlamaları bulmak için HTTP üstbilgilerini kullandığını söyleyebilirim, sitenin üstbilgileri chardet geri dönüyor kayıp. Oradan, indirdiği bayt kodunu çözer ve daha sonra bana r.text numaralı telefondan bir unicode nesnesi verir.

Hepsi güzel.

print foo.encode('utf-8') 

sorun yaptığımda şudur:

Ama nerede karıştı Sonra metin üzerinde bazı işler yapmak ve oradan ben yazdırırken bir kodlama sağlayan Stdout'a çıktısını olmasıdır Bu, yazdırılan şey berbat. Aşağıda, ben kelime 'yargılar' ve 'Standart' arasında bir kurmanıza almak için bekliyoruz:

Declaratory judgmentsStandard of review. 

Bunun yerine, içinde ben dört küçük sayılarla kutumsu şeyi olsun. Elbette, burada görünür görünmüyor, ama ben yaparsam ne elde karşılık gelen sayılar 0097 olduğunu düşünüyorum:

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

Bu yüzden bu tür mantıklı ama nerede benim kurmanıza var?

süreç aşağı kaynar:

  1. Talepleri bir sayfayı indirir ve akıllıca ben utf-8 ve baskı kodlamak
  2. onunla çalışmak unicode nesnesine metin deşifre dışarıda.

Sorun nerede? Bu bana mythical unicode sandwich gibi geliyor, ama açıkça bir şey eksik.

cevap

4

Tuhaf bir şey yapıyorsunuz. \x97, cp1252 kodlamasında bir emdash'dir. Bir Unicode dizesinde, U+0097 END OF GUARDED AREA. Bir şekilde, Unicode olarak cp1252 baytlarını okuyorsunuz. Sizi bu duruma getiren kodun daha fazlasını gösterin ve daha derine inebiliriz.

PS: Unicode sandviç neredeyse efsanevi bir şey değil, bunun için bir ideal! :)

+0

Yup! Başardın. [Sayfa] (http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669) problemdir. Bir kodlamayı bildirmez, bu yüzden chardet bunu 'ISO-8859-1' olarak tanır ve İstekler bunu böyle çözer. Sonra, onu utf-8 olarak kodladığımda, tabi ki de başarısız olur. Bunu kafanın üstünden nasıl öğrendin? Gelecekte bundan kaçınmak istiyorum? – mlissner

+0

Oh, ve başka bir soru ... Firefox ve Chrome bu sayfayı iso-8859-1 olarak algılıyorlar ... yine de emdashları mükemmel bir şekilde gösteriyorlar! Onların numarası nedir? – mlissner

+0

Uzun deneyim bana, \ x9X kodlanmış emdash gibi karakterlerin büyük olasılıkla cp1252 olduğunu söylüyor. Vikipedi'de görünmesi, cp1252'nin baytla eşleştiğini doğruladığınızı doğruladı. cp1252, iso8859-1'in hiçbiri bulunamayacağı basılabilir karakterlerle birlikte, iso8859-1'in bir üst kümesidir. Yani tarayıcılar 8859-1 kullanıyorlarsa, aslında cp1252 kullanıyorlar, çünkü neden olmasın, sadece daha fazla karakter yazdırılabilir yapıyor. –