Этот код работает из Aptana, но не работает в Python HTMLParser - PullRequest
0 голосов
/ 20 июля 2011

Так вот в чем смысл, в Aptana 3 с pyDev я не получаю никаких исключений, все вроде бы нормально.

Но когда я пытаюсь запустить непосредственно в python, bucle останавливается в какой-то момент, я думаю, этоможет быть совпадением с каким-то специальным символом вроде - или чем-то подобным.

class Spider(HTMLParser):
    def __init__(self, url):
        HTMLParser.__init__(self)
        string=[]
        string2=[]
        self.feed(urlopen(url).read()

    def handle_starttag(self, tag, attrs):
        if tag == 'a' and attrs:
            title= attrs[1][1]
            link= attrs[0][1]
            string.append(title)
            string2.append(link)

Я новичок в Python, поэтому я не могу получить более подробную информацию об исключениях, чем эта:

line 33, in __init__ self.feed(urlopen(url).read()) File "/usr/lib/python2.6/HTMLParser.py", line 108, 
in feed self.goahead(0)  File "/usr/lib/python2.6/HTMLParser.py", line 148, 
in goahead k = self.parse_starttag(i)  File "/usr/lib/python2.6/HTMLParser.py", line 252, 
in parse_starttag attrvalue = self.unescape(attrvalue)'])

Выход из рейза: </p> <pre><code> File "parse.py", line 65, in <module> Spider("http://...") File "parse.py", line 33, in __init__ self.feed(urlopen(url).read()) File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed self.goahead(0) File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead k = self.parse_starttag(i) File "/usr/lib/python2.6/HTMLParser.py", line 252, in parse_starttag attrvalue = self.unescape(attrvalue) File "/usr/lib/python2.6/HTMLParser.py", line 390, in unescape return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s) File "/usr/lib/python2.6/re.py", line 151, in sub return _compile(pattern, 0).sub(repl, string, count) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)

Теперь я могу пропустить ошибки, изменив это: </p> <pre><code>self.feed(unicode(urlopen(url).read(),errors='replace'))

Но все еще уродливое решениеМне нужны акценты в тексте.Я попробовал </p> <pre><code># -*- coding: latin-1 -*-

, но ничего не изменилось.

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Попробуйте это:

import sys
sys.setdefaultencoding('latin-1')

Некоторые связанные чтения: Python Unicode HOWTO .

0 голосов
/ 22 июля 2011

К сожалению, решение Макса не сработало.

AttributeError: у объекта 'module' нет атрибута 'setdefaultencoding'

Я наконец заставил его работать, добавив:

z=urlopen(url).read().decode('utf-8')
self.feed(z)
...