web-dev-qa-db-ja.com

UnicodeDecodeError: 'utf8'コーデックは34桁目のバイト0xc3をデコードできません:予期しないデータの終わり

スクレーパーを書き込もうとしていますが、エンコードに問題があります。探していた文字列をテキストファイルにコピーしようとすると、python2.7特殊文字がないにもかかわらず、エンコーディングを認識しなかったと私に言いました。それが有用な情報かどうかわからない。

私のコードは次のようになります:

from urllib import FancyURLopener
import os

class MyOpener(FancyURLopener): #spoofs a real browser on Window
   version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'

print "What is the webaddress?"
webaddress = raw_input("8::>")

print "Folder Name?"
foldername = raw_input("8::>")

if not os.path.exists(foldername):
    os.makedirs(foldername)

def urlpuller(start, page):
   while page[start]!= '"':
      start += 1
   close = start
   while page[close]!='"':
      close += 1
   return page[start:close]

myopener = MyOpener()

response = myopener.open(webaddress)
site = response.read()

nexturl = ''
counter = 0

while(nexturl!=webaddress):
   counter += 1
   start = 0

   for i in range(len(site)-35):
       if site[i:i+35].decode('utf-8') == u'<img id="imgSized" class="slideImg"':
         start = i + 40
         break
   else:
      print "Something's broken, chief. Error = 1"

   next = 0

   for i in range(start, 8, -1):
      if site[i:i+8] == u'<a href=':
         next = i
         break
   else:
      print "Something's broken, chief. Error = 2"

   nexturl = urlpuller(next, site)

   myopener.retrieve(urlpuller(start,site),foldername+'/'+foldername+str(counter)+'.jpg')

print("Retrieval of "+foldername+" completed.")

使用しているサイトを使用して実行しようとすると、次のエラーが返されます。

Traceback (most recent call last):
  File "yada/yadayada/Python/scraper.py", line 37, in <module>
    if site[i:i+35].decode('utf-8') == u'<img id="imgSized" class="slideImg"':
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 34: unexpected end of data

http://google.com を指すと、問題なく動作しました。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

しかし、utf-8を使用してデコードしようとすると、ご覧のとおり、機能しません。

助言がありますか?

6
user3701032
site[i:i+35].decode('utf-8')

受信したバイトをランダムに分割してから、UTF-8にデコードを依頼することはできません。 UTF-8はマルチバイトエンコーディングです。つまり、1文字を表すために1〜6バイトのどこでも使用できます。それを半分に切り、Pythonでデコードするように依頼すると、unexpected end of dataエラーがスローされます。

これがあなたのために構築されているツールを調べてください。 BeautifulSoup または lxml は2つの選択肢です。

10
Martin Konecny

Csvファイルを崇高に開き、「エンコードで保存」-> UTF-8。

0
Shivangi Sareen

Forループの代わりに、次のようにします。

start = site.decode('utf-8').find('<img id="imgSized" class="slideImg"') + 40
0
Daniel