Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 7, 2011 10:05:43

Kotjara2
От:
Зарегистрирован: 2011-02-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Разъясните ошибку.

Добрый день, так хочется разобраться с классами. Посмотрела

from HTMLParser import HTMLParser
import urllib

# урл к страничке, откуда будем тянуть ссылки
BASE_URL = 'http://mail.ru/'

class UrlFinder(HTMLParser):
''' Класс-наследник HTMLParser.
'''
def __init__(self):
HTMLParser.__init__(self)
self.links = []

def handle_starttag(self, tag, attrs):
''' Переопределяем метод HTMLParser (в базовом классе - метод ничего не делает)
Сам метод вызывается для обработки начала тега (фактически вызывается для каждого
начального тега при вызове метода "feed").
'''
attrs = dict(attrs)
# если находим тег 'a'
if 'a' == tag:
try:
# записываем значение аттрибута href в список-свойство links нашего класса
self.links.append(attrs['href'])
except:
pass

print "Getting url list..."
# создаём экземпляр класса UrlFinder()
parser = UrlFinder()
# вызываем метод feed, который передаёт текст в parser.
# Сам текст получаем по ссылке с помощью функций библиотеки urllib
parser.feed(urllib.urlopen(BASE_URL).read())
# теперь считаем количество найденных ссылок (просто подсчитывая количество элементов в links нашго экзепляра класса UrlFinder())
print "Founded ", len(parser.links), "urls"
Возникают ошибки



Traceback (most recent call last):
File “D:/ff.py”, line 34, in <module>
parser.feed(urllib.urlopen(BASE_URL).read())
File “C:\Python27\lib\HTMLParser.py”, line 108, in feed
self.goahead(0)
File “C:\Python27\lib\HTMLParser.py”, line 148, in goahead
k = self.parse_starttag(i)
File “C:\Python27\lib\HTMLParser.py”, line 252, in parse_starttag
attrvalue = self.unescape(attrvalue)
File “C:\Python27\lib\HTMLParser.py”, line 390, in unescape
return re.sub(r"&(#??(?:+|\w{1,8}));“, replaceEntities, s)
File ”C:\Python27\lib\re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd1 in position 25: ordinal not in range(128)

Что удивительно, если ссылка будет python.su то все будет супер. Если поставить в моем ulr (http://mail.ru) в конце функции handle_starttag
def handle_starttag(self, tag, attrs):
''' Переопределяем метод HTMLParser (в базовом классе - метод ничего не делает)
Сам метод вызывается для обработки начала тега (фактически вызывается для каждого
начального тега при вызове метода "feed").
'''
attrs = dict(attrs)
# если находим тег 'a'
if 'a' == tag:
try:
#print attrs['href']
# записываем значение аттрибута href в список-свойство links нашего класса
self.links.append(attrs['href'])
except:
pass
for i in self.links
print i
Печатает верно, значит проблема в feed . И как ее исправить? Просьба помочь, объяснить…



Отредактировано (Июнь 7, 2011 10:46:37)

Офлайн

#2 Июнь 7, 2011 10:47:50

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Разъясните ошибку.

Мне выкидывает: HTMLParseError: malformed start tag, at line 142, column 127

Но теоретически попробуйте декодировать принятые данные:

parser.feed(urllib.urlopen(BASE_URL).read().decode('cp1251'))



Офлайн

#3 Июнь 7, 2011 11:30:22

Kotjara2
От:
Зарегистрирован: 2011-02-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Разъясните ошибку.

Сделала по вашему-)
Traceback (most recent call last):
File “D:\ff.py”, line 35, in <module>
parser.feed(urllib.urlopen(url).read().decode('windows-1251'))
File “C:\Python26\lib\HTMLParser.py”, line 108, in feed
self.goahead(0)
File “C:\Python26\lib\HTMLParser.py”, line 150, in goahead
k = self.parse_endtag(i)
File “C:\Python26\lib\HTMLParser.py”, line 317, in parse_endtag
self.error(“bad end tag: %r” % (rawdata,))
File “C:\Python26\lib\HTMLParser.py”, line 115, in error
raise HTMLParseError(message, self.getpos())
HTMLParseError: bad end tag: u“</scr'+'ipt>”, at line 2119, column 100

Сейчас такая ошибка….Что делать?



Офлайн

#4 Июнь 7, 2011 13:39:19

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Разъясните ошибку.

Насколько я понимаю это говорит о невалидном HTML…

Учитывая что повторить ее я не могу, незнаю… искать инфу, читать доки.
может с HTMLparser.CDATA_CONTENT_ELEMENTS поиграться.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version