2016-06-14 4 views
1

Скребковый сайт с китайскими символами. Как мне ломать chineese simbolse ??Кодировать ошибку соскабливания

from urllib.request import urlopen 
from urllib.parse import urljoin 

from lxml.html import fromstring 

URL = 'http://list.suning.com/0-258003-0.html' 
ITEM_PATH = '.clearfix .product .border-out .border-in .wrap .res-info .sell-point' 

def parse_items(): 
    f = urlopen(URL) 
    list_html = f.read().decode('utf-8') 
    list_doc = fromstring(list_html) 

    for elem in list_doc.cssselect(ITEM_PATH): 
     a = elem.cssselect('a')[0] 
     href = a.get('href') 
     title = a.text 
     em = elem.cssselect('em')[0] 
     title2 = em.text 
     print(href, title, title2) 


def main(): 
    parse_items() 

if __name__ == '__main__': 
    main() 

Ошибка выглядит так. Ошибка выглядит выглядит это ошибка, как выглядит эта ошибка, как это ошибка выглядит так

http://product.suning.com/0000000000/146422477.html Traceback (most recent call last): 
    File "parser.py", line 27, in <module> 
    main() 
    File "parser.py", line 24, in main 
    parse_items() 
    File "parser.py", line 20, in parse_items 
    print(href, title, title2) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 
+0

пожалуйста обеспечивают полный стек ошибок для кода, который вы дали нам в этом вопросе – DomTomCat

+0

у меня есть некоторые проблемы с UTF-8. добавлено –

+0

Возможно, этот ответ [http://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20](http://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-can-encode-character-u-xa0-in-position-20) может вам помочь. – gzc

ответ

0

Из print синтаксиса и импорта, я предполагаю, что вы используете версию Python3, так как это может иметь значение для Юникода ,

Итак, мы можем ожидать, что href, title и title2 - все строки Unicode (или строки Python 3). Но функция печати попытается преобразовать строки в кодировку, приемлемую для системы вывода - по какой-то причине я не могу знать, система использует по умолчанию ASCII, поэтому ошибка.

Как исправить:

  • лучшим способом было бы сделать вашу систему принять Юникода. В Linux или других unixes вы можете объявить кодировку UTF8 в переменной среды LANG (export LANG=en_US.UTF-8), в Windows вы можете попробовать chcp 65001, но это последнее, если вы не уверены
  • , если он не работает или не соответствует вашим потребностям, вы можете принудительно форсировать явное кодирование или более точно фильтровать нарушающие символы, потому что Python3 изначально использует строки unicode.

Я хотел бы использовать:

import sys 

def u_filter(s, encoding = sys.stdout.encoding): 
    return (s.encode(encoding, errors='replace').decode(encoding) 
     if isinstance(s, str) else s) 

Это означает, что: если s является строка Юникода кодировать его в кодировке, используемой для стандартного вывода, заменяя любой нерастворимый обратимый характер замещающим полукокса и декодировать его обратно в а теперь чистая строка

и следующая:

def fprint(*args, **kwargs): 
    fargs = [ u_filter(arg) for arg in args ] 
    print(*fargs, **kwargs) 

означает: отфильтровать обижая гр haracter из строк unicode и распечатать оставшиеся без изменений.

С, что вы можете спокойно заменить печать бросать исключение с:

fprint(href, title, title2)