2010-07-01 3 views
0

Я написал следующий пробный код, чтобы получить название законодательных актов Европейского парламента.Проблема с очисткой данных с использованием BeautifulSoup

import urllib2 
from BeautifulSoup import BeautifulSoup 

search_url = "http://www.europarl.europa.eu/sides/getDoc.do?type=REPORT&mode=XML&reference=A7-2010-%.4d&language=EN" 

for number in xrange(1,10): 
    url = search_url % number 
    page = urllib2.urlopen(url).read() 
    soup = BeautifulSoup(page) 
    title = soup.findAll("title") 
    print title 

Однако всякий раз, когда я запускаю его я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<stdin>", line 20, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 70: ordinal not in range(128) 

я сузил его до BeautifulSoup не в состоянии прочитать четвертый документ в цикле. Может ли кто-нибудь объяснить мне, что я делаю неправильно?

С наилучшими пожеланиями

Томас

ответ

1

Замена

print title 

с

for t in title: 
    print(t) 

или

print('\n'.join(t.string for t in title)) 

работ. Я не совсем уверен, почему print <somelist> иногда работает, а иногда и не работает.

+0

Уважаемый Unutbu, спасибо за советы, как работа для меня , Weird ... –

4

BeautifulSoup работает в Unicode, поэтому он не несет ответственности за это декодирование ошибка. Скорее всего, ваша проблема связана с оператором print. Ваш стандартный вывод, кажется, находится в ascii (то есть, sys.stdout.encoding = 'ascii' или отсутствует), и поэтому вы действительно получите такие ошибки, если будете пытаться распечатать строку, содержащую символы, отличные от ascii.

Какая у вас ОС? Как устанавливается ваш консольный терминал AKA (например, если на Windows какая «кодовая страница»)? Вы установили в среду PYTHONIOENCODING для управления sys.stdout.encoding или вы просто надеетесь, что кодировка будет автоматически поднята?

На моем Mac, где кодирование является Правильными обнаружено, работающим кодом (за исключение также печататься номера вместе с каждым заголовком, для ясности) отлично работает и показывает:

$ python ebs.py 
1 [<title>REPORT Report on the proposal for a Council regulation temporarily suspending autonomous Common Customs Tariff duties on imports of certain industrial products into the autonomous regions of Madeira and the Azores - A7-0001/2010</title>] 
2 [<title>REPORT Report on the proposal for a Council directive concerning mutual assistance for the recovery of claims relating to taxes, duties and other measures - A7-0002/2010</title>] 
3 [<title>REPORT Report on the proposal for a regulation of the European Parliament and of the Council amending Council Regulation (EC) No 1085/2006 of 17 July 2006 establishing an Instrument for Pre-Accession Assistance (IPA) - A7-0003/2010</title>] 
4 [<title>REPORT on equality between women and men in the European Union – 2009 - A7-0004/2010</title>] 
5 [<title>REPORT Report on the proposal for a Council decision on the conclusion by the European Community of the Convention on the International Recovery of Child Support and Other Forms of Family Maintenance - A7-0005/2010</title>] 
6 [<title>REPORT on the proposal for a Council directive on administrative cooperation in the field of taxation - A7-0006/2010</title>] 
7 [<title>REPORT Report on promoting good governance in tax matters - A7-0007/2010</title>] 
8 [<title>REPORT Report on the proposal for a Council Directive amending Directive 2006/112/EC as regards an optional and temporary application of the reverse charge mechanism in relation to supplies of certain goods and services susceptible to fraud - A7-0008/2010</title>] 
9 [<title>REPORT Recommendation on the proposal for a Council decision concerning the conclusion, on behalf of the European Community, of the Additional Protocol to the Cooperation Agreement for the Protection of the Coasts and Waters of the North-East Atlantic against Pollution - A7-0009/2010</title>] 
$ 
+0

Привет, Алекс, я действительно использую Mac, как вы настраиваете свой? Прямо сейчас я просто надеюсь, что кодировка будет автоматически поднята (я все еще узнаю об этом запутанном бизнесе кодирования :)) –

+0

@Thomas, я не сделал никакой настройки - работает из коробки (utf8 по умолчанию для Terminal.App, я верю - если нет, то это единственное, что я установил в настройках терминала). Что такое 'sys.stdout.encoding' в вашем Python (действительно, что такое ваш Python и MacOSX? У меня OSX 10.5, и он работает с распределенным Apple Python 2.5 и python.org-распределенными 2.4, 2.6 и 3.1 - все из коробки и без настройки переменной среды). –

+0

Привет, alex, я использую MacOSx 10.5.8 и python 2.6. –

0

Если вы хотите для печати титров в файл вам нужно указать некоторую кодировку, которая может представлять символ non-ascii, utf8 должен работать нормально. Чтобы сделать это, вам нужно добавить:

out = codecs.open('titles.txt', 'w', 'utf8') 

в верхней части сценария

и печать файла:

print >> out, title 
+0

Привет, Мальтув, спасибо за помощь, но он по-прежнему дает мне ту же ошибку. –

Смежные вопросы