0

次のエラーが表示されます。

UnicodeEncodeError: 'ascii' コーデックは位置 1409 の文字 u'\u2661' をエンコードできません: 序数が範囲内にありません(128)

私はまだプログラミングに非常に慣れているので、私と私の無知を憐れんでください。しかし、ユニコード文字を処理できないというエラーは理解しています。少なくとも 1 つの Unicode 文字がありますが、そのフィードで元気になる無数の他の文字が存在する可能性があります。

同様の問題を抱えている他の人を探してみましたが、理解できる解決策や機能する解決策が見つかりません。

#import library to do http requests:
import urllib
from xml.dom.minidom import parseString, parse

f = open('games.html', 'w')

document = urllib.urlopen('https://itunes.apple.com/us/rss/topfreemacapps/limit=300/genre=12006/xml')

dom = parse(document)

image = dom.getElementsByTagName('im:image')
title = dom.getElementsByTagName('title')
price = dom.getElementsByTagName('im:price')
address = dom.getElementsByTagName('id')

imglist = []
titlist = []
pricelist = []
addlist = []

i = 0
j = 20
k = 40

f.write('''\
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
<!--


A:link {text-decoration: none; color: #246DA8;}
A:visited {text-decoration: none; color: #246DA8;}
A:active {text-decoration: none; color: #40A9E3;}
A:hover {text-decoration: none; color: #40A9E3;}

.box {
    vertical-align:middle;
    width: 180px;
    height: 120px;
    border: 1px solid #99c;
    padding: 5px;
    margin: 0px;
    margin-left: auto;
    margin-right: auto;
    -moz-border-radius: 5px;
    border-radius: 5px;
    -webkit-border-radius: 5px;
    background-color:#ffffff;
    font-family: Arial, Helvetica, sans-serif; color: black;
    font-size: small;
    font-weight: bold;
}


-->
</style>
</head>

<body>
''')

for i in range(0,len(image)):
    if image[i].getAttribute('height') == '53':
        imglist.append(image[i].firstChild.nodeValue)

for i in range(1,len(title)):
    titlist.append(title[i].firstChild.nodeValue)

for i in range(0,len(price)):
    pricelist.append(price[i].firstChild.nodeValue)

for i in range(1,len(address)):
    addlist.append(address[i].firstChild.nodeValue) 

for i in range(0,20):

            f.write('''
<div style="width: 600px;">
 <div style="float: left; width: 200px;">
    <div class="box" align="center">
        <div align="center">
            <a href="''' + addlist[i] + '''?at=10l5NR"  target="_blank">''' + titlist[i] + '''</a><br>
            <a href="''' + addlist[i] + '''?at=10l5NR" target="_blank"><img src="''' + imglist[i] + '''" alt="" width="53" height="53" border="0" ></a><br>
            <span>''' + pricelist[i] + '''</span>
        </div>
    </div>
 </div>
  <div style="float: left; width: 200px;">
 <div class="box" align="center">
        <div align="center">
            <a href="''' + addlist[i+j] + '''?at=10l5NR"  target="_blank">''' + titlist[i+j] + '''</a><br>
            <a href="''' + addlist[i+j] + '''?at=10l5NR" target="_blank"><img src="''' + imglist[i+j] + '''" alt="" width="53" height="53" border="0" ></a><br>
            <span>''' + pricelist[i+j] + '''</span>
        </div>
    </div>
 </div>
 <div style="float: left; width: 200px;">
 <div class="box" align="center">
        <div align="center">
            <a href="''' + addlist[i+k] + '''?at=10l5NR"  target="_blank">''' + titlist[i+k] + '''</a><br>
            <a href="''' + addlist[i+k] + '''?at=10l5NR" target="_blank"><img src="''' + imglist[i+k] + '''" alt="" width="53" height="53" border="0" ></a><br>
            <span>''' + pricelist[i+k] + '''</span>
        </div>
    </div>
</div>
<br style="clear: left;" />
</div>


<br>
''')
f.write('''</body>''')

f.close()
4

1 に答える 1

1

基本的な問題は、適切なエンコーディングを使用して変換せずに、Unicode 文字列を通常のバイト文字列と連結していることです。これらの場合、デフォルトで ASCII が使用されます (明らかに、拡張文字を処理できません)。

これを行うスクリプトの行は長すぎて引用できませんが、同じ問題を示す別の実際的な例は次のようになります。

parameter = u"foo \u2661"
sys.stdout.write(parameter + " bar\n")

代わりに、次のように、明示的に指定されたエンコーディングで Unicode 文字列をエンコードする必要があります。

parameter = u"foo \u2661"
sys.stdout.write(parameter.encode("utf8") + " bar\n")

あなたの場合、すべての連結で指定する必要がないように、ループでこれを行うことができます。

for i in range(1,len(title)):
    titlist.append(title[i].firstChild.nodeValue.encode("utf8"))

--

また、整数インデックスを使用して要素を反復処理しないことで、コードを改善できます。たとえば、これの代わりに:

title = dom.getElementsByTagName('title')
for i in range(1,len(title)):
    titlist.append(title[i].firstChild.nodeValue.encode("utf8"))

...代わりにこれを行うことができます:

for title in dom.getElementsByTagName('title')
    titlist.append(title.firstChild.nodeValue.encode("utf8"))
于 2013-09-23T00:28:59.620 に答える