2016-01-10 132 views
1

我正在使用下面顯示的過程來編寫(從網絡上搜索)人員數據列表。 我認爲代碼本身沒問題,但我對結果感到困惑。有些字符解碼正確,有些則不正確。例如:如何修復錯誤的解碼?

STANIS?AWurodzony/a 01.01.1888, ?Ԅ? 
HALINAurodzony/a 05.07.1927, ŁÓDŹ 

兩個字符串中的最後一個字是相同的! 另外?通過符號來代替不可翻譯字符一旦使用一次沒有:

STANISŁAWurodzony/a 24.03.1907, RAKSZANY 
    ^
     | here is written ok - not replaced 

這裏是代碼:

def findPerson(): 
    file = codecs.open('Names.txt','a','ISO-8859-1','replace') 
    try: 
     with codecs.open('./listNames_links.txt','r','ISO-8859-1','replace') as f: 
      line = f.readline() 
      while line != '': 
       #print line, 
       line = f.readline() 
       res = requests.get('http://real.address.gov.pl'+line) 
       res.raise_for_status() 
       soup = BeautifulSoup(res.text) 
       linkElems = soup.find('a','css_class_name').text 
       file.write(linkElems) 
       file.write('\r\n')#preserve end-of-line 

問題: 如何解決這個問題。我的程序錯了嗎?或者源頁面破壞了編碼? (我認爲沒關係,我可以在瀏覽器中閱讀它,沒有任何錯誤。)

回答

1

這看起來像一種波蘭語,看起來不像多字節編碼,如UTF-8被使用。您正在使用ISO-8859-1寫入您的Names.txt文件,該文件不支持所有波蘭語字符。

您可以使用ISO-8859-2來支持波蘭語,但更好的辦法是使用支持所有語言的UTF-8,它是網絡上的通用標準。

嘗試

file = codecs.open('Names.txt','a','UTF-8','replace') 

當您使用的要求,嘗試檢查每一頁的編碼的請求。例如:

res = requests.get('http://real.address.gov.pl'+line) 
res.encoding = 'utf-8' 
soup = BeautifulSoup(res.text) 
+0

我知道,這是正確的解決方案,我嘗試了這一點,但問題是每次執行代碼都會導致結果不同。 –

+0

我剛剛看到你的評論 - 這是否修復?如果不是,請確認兩行「ŁÓDŹ」和「?Ԅ?」是否來自兩個不同的URL位置。 –

+0

你是對的,那些是不同的地點:兩個不同的人的出生地點發現兩個不同的請求。但所有數據都來自一個數據庫。你有沒有使用請求模塊?代碼中的變量**行**可能如下所示:**'/listNames.do?idx=]&katalogId=2&pageNo=1&nameId=007&'** –

1

我對python不是很熟悉,但是java程序有類似的問題。在幾乎所有情況下,都是這樣的問題,在所有步驟中都使用不同的編碼,因此在轉換時會導致難看的字符。

如果可能,我建議在整個過程中使用UTF-8。

閒談邊的話:因爲我stumpled在此所以很多時候,我給自己買了this T-Shirt(正確拼寫Scheiß,德語廢話),將其佩戴在工作;-)

相關問題