Использование специальных символов в Python 2.6 - PullRequest
0 голосов
/ 08 октября 2010

Я более чем устал, но здесь идет:

Я делаю просмотр HTML-кода в Python 2.6.5 с BeautifulSoap на Ubuntubox

Причина для Python 2.6.5: BeautifulSoap отстой под 3.1

Я пытаюсь запустить следующий код:

# dataretriveal from html files from DETHERM
# -*- coding: utf-8 -*-

import sys,os,re,csv
from BeautifulSoup import BeautifulSoup


sys.path.insert(0, os.getcwd())

raw_data = open('download.php.html','r')
soup = BeautifulSoup(raw_data)

for numdiv in soup.findAll('div', {"id" : "sec"}):
    currenttable = numdiv.find('table',{"class" : "data"})
    if currenttable:
        numrow=0
        numcol=0
        data_list=[]
        for row in currenttable.findAll('td', {"class" : "dataHead"}):
            numrow=numrow+1
        for ncol in currenttable.findAll('th', {"class" : "dataHead"}):
            numcol=numcol+1
        for col in currenttable.findAll('td'):
            col2 = ''.join(col.findAll(text=True))
        if col2.index('±'):
        col2=col2[:col2.index('±')]
            print(col2.encode("utf-8"))
        ref=numdiv.find('a')
        niceref=''.join(ref.findAll(text=True))

Теперь из-за знаков ± я получаю следующую ошибку при попытке интерпретировать код:

python code.py

Traceback (последний вызов был последним): Файл "detherm-wtest.py", строка 25, в если col2.index ('±'): UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xc2 в позиции 0: порядковый номер не в диапазоне (128)

Как мне решить это? если положить u, получим: '±' -> u '±':

Traceback (последний вызов был последним): Файл "detherm-wtest.py", строка 25, в если col2.index (u '±'): ValueError: подстрока не найдена

текущая кодировка файла кодировки utf-8

спасибо

1 Ответ

2 голосов
/ 08 октября 2010

Строки байтов, такие как "±" (в Python 2.x), кодируются в кодировке исходного файла, что может быть не тем, что вы хотите. Если col2 действительно объект Unicode, вы должны использовать u"±" вместо этого, как вы уже пробовали. Возможно, вы знаете, что somestring.index вызывает исключение, если не находит вхождения, тогда как somestring.find возвращает -1. Следовательно, это

    if col2.index('±'):
        col2=col2[:col2.index('±')] # this is not indented correctly in the question BTW
        print(col2.encode("utf-8"))

должно быть

    if u'±' in col2:
        col2=col2[:col2.index(u'±')]
        print(col2.encode("utf-8"))

чтобы оператор if не приводил к исключению.

...